인쇄 용지를 문서 크기로 제시 + Select 형 배선 필터 실행 — 남은 과제 2건
① PDF 높이 어긋남(735pt vs 문서 642pt) 원인 규명·수정: 인쇄가 용지(PrintTicket)를 지정하지 않아 드라이버가 폭이 비슷한 기본 용지 (540×735pt ≈ 16절 190×260mm — test1.pdf MediaBox 실측)에 문서를 얹었다. 폭이 우연히 같아 좌우는 멀쩡하고 아래에만 33mm 여백이 붙어 화면과 다른 종이가 됐다. ShowDialog 전에 PageMediaSize 를 문서 첫 페이지 DIP 크기로 제시 — 사용자가 대화상자에서 용지를 바꾸면 그 선택이 이긴다. (레거시는 사용자가 고른 용지에 문서를 맞추는 방식 (clPrintDesignSheet.vb:660)이라 이 기본값 제시와 충돌하지 않는다.) ② Select 형 DataTableField 필터(운영 268건, 12%) 실행: 지금까지 "아직 옮기지 않았습니다" 사유였다. 필터 문법을 직접 파싱하지 않고 .NET DataTable.Select 에 그대로 넘긴다 — 레거시 배선이 쓰는 바로 그 엔진이라 문법 호환을 증명할 필요가 없다. 행 선택을 순수 함수 (DataTableFieldPicker)로 분리해 DB 없이 검증(테스트 5건 — 필터·0행· 문법 오류·Rows 형·중복 컬럼명 Fill 규칙). 알려진 한계 주석: 우리 결과는 전부 문자열 컬럼이라 숫자 대소 비교 필터는 사전순이 될 수 있다(운영 필터 대부분은 동등 비교). - dotnet test 347/347 (picker 5건 추가) · --edit-smoke 실패 0 - --db-patient ①~㊱ 전건 통과 - --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
31a05c205b
commit
2310971a10
@@ -95,42 +95,14 @@ public sealed class MDataTableRunner : IDataFieldResolver
|
||||
// 아무 표시 없이 빈칸이 된다. 여기서는 이름을 말한다.
|
||||
return new TagValue(false, $"데이터소스 '{spec.TableName}' 이 이 서식에 없습니다");
|
||||
}
|
||||
if (spec.Form == DataTableFieldForm.Select && spec.Filter.Length > 0)
|
||||
{
|
||||
// Select 필터는 DataTable.Select 의 메모리 필터 문법이다(SQL 이 아니다).
|
||||
// 아직 옮기지 않았다 — 무시하고 행 번호만 쓰면 <b>다른 행의 값</b>이 조용히 찍힌다.
|
||||
return new TagValue(false, $"Select 필터를 아직 옮기지 않았습니다: {spec.Filter}");
|
||||
}
|
||||
|
||||
var run = Run(spec.TableName);
|
||||
if (!run.Ok)
|
||||
{
|
||||
return new TagValue(false, run.Error ?? "조회에 실패했습니다");
|
||||
}
|
||||
if (spec.RowIndex >= run.Rows.Count)
|
||||
{
|
||||
return new TagValue(false, run.Rows.Count == 0
|
||||
? "조회 결과가 0행입니다"
|
||||
: $"{spec.RowIndex}번 행이 없습니다(결과 {run.Rows.Count}행)");
|
||||
}
|
||||
var column = -1;
|
||||
for (var i = 0; i < run.Columns.Count; i++)
|
||||
{
|
||||
if (string.Equals(run.Columns[i], spec.Field, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
column = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (column < 0)
|
||||
{
|
||||
return new TagValue(false, $"결과에 '{spec.Field}' 컬럼이 없습니다"
|
||||
+ $" (있는 컬럼: {string.Join(", ", run.Columns.Take(8))})");
|
||||
}
|
||||
var cell = run.Rows[spec.RowIndex][column] ?? string.Empty;
|
||||
return cell.Length > 0
|
||||
? new TagValue(true, cell)
|
||||
: new TagValue(false, $"{spec.Field} 값이 비어 있습니다");
|
||||
// 행 선택(Rows 형 번호 / Select 형 .NET DataTable.Select 필터)은
|
||||
// 순수 함수에 있다 — DB 없이 검증할 수 있어야 진단이 접속에 안 묶인다
|
||||
return DataTableFieldPicker.Pick(run.Columns, run.Rows, spec);
|
||||
}
|
||||
|
||||
private MDataTableResult Execute(string name)
|
||||
|
||||
@@ -21,6 +21,18 @@ public static class PrintService
|
||||
SheetMe.Core.Catalog.IDataFieldResolver? fields = null)
|
||||
{
|
||||
var dialog = new System.Windows.Controls.PrintDialog();
|
||||
// 용지를 문서 크기로 미리 지정한다 — 지정하지 않으면 드라이버가 폭이 비슷한
|
||||
// 기본 용지에 얹는다. 실측: P062(720×856DIP = 540×642pt)를 PDF 로 뽑았더니
|
||||
// MediaBox 가 540×735pt(≈16절 190×260mm)였다 — 폭이 우연히 같아 좌우는 멀쩡하고
|
||||
// 아래에만 33mm 여백이 더 붙어 화면과 다른 종이가 됐다.
|
||||
// ShowDialog <b>전에</b> 넣어야 대화상자의 기본값이 되고, 사용자가 대화상자에서
|
||||
// 용지를 바꾸면 그 선택이 이긴다(우리는 기본값만 제시한다).
|
||||
if (designer.Pages.Count > 0)
|
||||
{
|
||||
var first = designer.Pages[0];
|
||||
dialog.PrintTicket.PageMediaSize = new System.Printing.PageMediaSize(
|
||||
first.WidthDip, first.HeightDip); // PageMediaSize 는 1/96" (DIP) 단위다
|
||||
}
|
||||
if (dialog.ShowDialog() != true)
|
||||
{
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user