VistA-cprs/CPRS-Chart/fReportsPrint.pas

613 lines
25 KiB
Plaintext

unit fReportsPrint;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, fAutoSz, ORCtrls, ORNet, Mask, ComCtrls, rECS,
fBase508Form, VA508AccessibilityManager;
type
TfrmReportPrt = class(TfrmBase508Form)
lblReportsTitle: TMemo;
lblPrintTo: TLabel;
grpDevice: TGroupBox;
lblMargin: TLabel;
lblLength: TLabel;
txtRightMargin: TMaskEdit;
txtPageLength: TMaskEdit;
cboDevice: TORComboBox;
cmdOK: TButton;
cmdCancel: TButton;
dlgWinPrinter: TPrintDialog;
chkDefault: TCheckBox;
procedure cboDeviceChange(Sender: TObject);
procedure cmdOKClick(Sender: TObject);
procedure cmdCancelClick(Sender: TObject);
procedure cboDeviceNeedData(Sender: TObject; const StartFrom: String;
Direction, InsertAt: Integer);
procedure FindVType;
private
{ Private declarations }
FReports: string;
FReportText: TRichEdit;
procedure DisplaySelectDevice;
public
{ Public declarations }
end;
var
frmReportPrt: TfrmReportPrt;
procedure PrintReports(AReports: string; const AReportsTitle: string);
function StringPad(aString: string; aStringCount, aPadCount: integer): String;
function DeleteLineBreaks(const S: string): string;
implementation
{$R *.DFM}
uses ORFn, rCore, uCore, fReports, rReports, uReports, Printers, fFrame,
VAUtils;
const
TX_NODEVICE = 'A device must be selected to print, or press ''Cancel'' to not print.';
TX_NODEVICE_CAP = 'Device Not Selected';
TX_ERR_CAP = 'Print Error';
PAGE_BREAK = '**PAGE BREAK**';
QT_OTHER = 0;
QT_HSTYPE = 1;
QT_DATERANGE = 2;
QT_IMAGING = 3;
QT_NUTR = 4;
QT_PROCEDURES = 19;
QT_SURGERY = 28;
QT_HSCOMPONENT = 5;
QT_HSWPCOMPONENT = 6;
procedure PrintReports(AReports: string; const AReportsTitle: string);
{ displays a form that prompts for a device and then prints the report }
var
frmReportPrt: TfrmReportPrt;
DefPrt: string;
begin
frmReportPrt := TfrmReportPrt.Create(Application);
try
ResizeAnchoredFormToFont(TForm(frmReportPrt));
with frmReportPrt do
begin
lblReportsTitle.Text := AReportsTitle;
FReports := AReports;
DefPrt := GetDefaultPrinter(User.Duz, Encounter.Location);
if User.CurrentPrinter = '' then User.CurrentPrinter := DefPrt;
with cboDevice do
begin
if Printer.Printers.Count > 0 then
begin
Items.Add('WIN;Windows Printer^Windows Printer');
Items.Add('^--------------------VistA Printers----------------------');
end;
if User.CurrentPrinter <> '' then
begin
InitLongList(Piece(User.CurrentPrinter, ';', 2));
SelectByID(User.CurrentPrinter);
end
else
InitLongList('');
end;
if (DefPrt = 'WIN;Windows Printer') and
(User.CurrentPrinter = DefPrt) then
cmdOKClick(frmReportPrt)
else
ShowModal;
end;
finally
frmReportPrt.Release;
end;
end;
procedure TfrmReportPrt.FindVType;
var
i,j,k,L,cnt: integer;
aBasket: TStringList;
aID, aHead, aData, aCol, x: string;
ListItem: TListItem;
aWPFlag: Boolean;
DistanceFromLeft, DistanceRemaining, TotalSpaceAvailable: Integer;
SigText, LineBreak, PageBreak, LeftMask: string;
LinesPerPage, Limit, Z: Integer;
WrappedSig: TStringList;
begin
aBasket := TStringList.Create;
aBasket.Clear;
aHead := '';
cnt := 2;
for i := 0 to uColumns.Count - 1 do
begin
if (piece(uColumns[i],'^',7) = '1') and (not(piece(uColumns[i],'^',4) = '1')) then
begin
L := StrToIntDef(piece(uColumns[i],'^',6),15);
if length(piece(uColumns[i],'^',8)) > 0 then
x := piece(uColumns[i],'^',8)
else
x := piece(uColumns[i],'^',1);
x := StringPad(x, L, L+1);
if frmReports.TabControl1.Tabs.Count > 1 then
aHead := aHead + x
else
if i = 0 then
continue
else
aHead := aHead + x;
end;
end;
if length(aHead) > 0 then
begin
FReportText.Lines.Add(aHead);
FReportText.Lines.Add('-------------------------------------------------------------------------------');
TotalSpaceAvailable := Length(FReportText.Lines[FReportText.Lines.Count - 1]);
end;
for i := 0 to frmReports.lvReports.Items.Count - 1 do
if frmReports.lvReports.Items[i].Selected then
begin
aData := '';
aWPFlag := false;
ListItem := frmReports.lvReports.Items[i];
aID := ListItem.SubItems[0];
if frmReports.TabControl1.Tabs.Count > 1 then
begin
L := StrToIntDef(piece(uColumns[0],'^',6),10);
x := StringPad(ListItem.Caption, L, L+1);
aData := x;
end;
for j := 0 to RowObjects.ColumnList.Count - 1 do
begin
aCol := TCellObject(RowObjects.ColumnList[j]).Handle;
if piece(aID,':',1) = piece(TCellObject(RowObjects.ColumnList[j]).Handle,':',1) then
if ListItem.Caption = (piece(TCellObject(RowObjects.ColumnList[j]).Site,';',1)) then
begin
if (piece(uColumns[StrToInt(piece(aCol,':',2))],'^',7) = '1') and
(not (piece(uColumns[StrToInt(piece(aCol,':',2))],'^',4) = '1')) then
begin
FastAssign(TCellObject(RowObjects.ColumnList[j]).Data, aBasket);
if POS('SIG', piece(uColumns[StrToInt(piece(aCol, ':', 2))], '^', 1)) > 0 then begin
DistanceFromLeft := Length(aData); //distance from the left side of the page
DistanceRemaining := TotalSpaceAvailable - DistanceFromLeft; //Distance to end of page
LinesPerPage := 40;
Limit := 10; //Arbitrary limit to detrmine if there is enough space to bother with wrapping.
LineBreak := #13#10;
PageBreak := '**PAGE BREAK**';
X := '';
LeftMask := StringOfChar(' ', DistanceFromLeft);
//remove any line breaks from the text
SigText := StringReplace(aBasket.Text, #13#10, '', [rfReplaceAll]);
if DistanceRemaining < Limit then begin
DistanceRemaining := TotalSpaceAvailable;
LeftMask := '';
end;
WrappedSig := TStringList.Create;
try
WrappedSig.Text := WrapText(SigText, LineBreak + LeftMask, [' '], DistanceRemaining);
For Z := 0 to WrappedSig.Count - 1 do begin
Inc(Cnt);
If Cnt > LinesPerPage then x := x + PageBreak;
X := X + WrappedSig.Strings[Z] + LineBreak;
end;
finally
FreeAndNil(WrappedSig);
end;
aData := aData + x;
end else begin
for k := 0 to aBasket.Count - 1 do
begin
L := StrToIntDef(piece(uColumns[StrToInt(piece(aCol,':',2))],'^',6),15);
x := StringPad(aBasket[k], L, L+1);
aData := aData + x;
end;
end;
end;
end;
end;
FReportText.Lines.Add(aData);
cnt := cnt + 1;
if cnt > 40 then
begin
cnt := 0;
FReportText.Lines.Add('**PAGE BREAK**');
end;
for j := 0 to RowObjects.ColumnList.Count - 1 do
begin
aCol := TCellObject(RowObjects.ColumnList[j]).Handle;
if piece(aID,':',1) = piece(TCellObject(RowObjects.ColumnList[j]).Handle,':',1) then
if ListItem.Caption = (piece(TCellObject(RowObjects.ColumnList[j]).Site,';',1)) then
begin
if (piece(uColumns[StrToInt(piece(aCol,':',2))],'^',7) = '1') and
(piece(uColumns[StrToInt(piece(aCol,':',2))],'^',4) = '1') then
begin
aWPFlag := true;
FastAssign(TCellObject(RowObjects.ColumnList[j]).Data, aBasket);
FReportText.Lines.Add(TCellObject(RowObjects.ColumnList[j]).Name);
cnt := cnt + 1;
for k := 0 to aBasket.Count - 1 do
begin
FReportText.Lines.Add('' + aBasket[k]);
cnt := cnt + 1;
if cnt > 40 then
begin
cnt := 0;
FReportText.Lines.Add('**PAGE BREAK**');
end;
end;
end;
end;
end;
if aWPFlag = true then
begin
FReportText.Lines.Add('===============================================================================');
end;
end;
aBasket.Free;
end;
function DeleteLineBreaks(const S: string): string;
var
Source, SourceEnd: PChar;
begin
Source := Pointer(S);
SourceEnd := Source + Length(S);
while Source < SourceEnd do
begin
case Source^ of
#10: Source^ := #32;
#13: Source^ := #32;
end;
Inc(Source);
end;
Result := S;
end;
function StringPad(aString: string; aStringCount, aPadCount: integer): String;
var
s: integer;
begin
if aStringCount >= aPadCount then
aStringCount := aPadCount - 1;
Result := copy(aString, 1, aStringCount);
s := aPadCount - length(Result);
if s < 0 then s := 0;
Result := Result + StringOfChar(' ', s);
end;
procedure TfrmReportPrt.DisplaySelectDevice;
begin
with cboDevice, lblPrintTo do
begin
Caption := 'Print Report on: ' + Piece(ItemID, ';', 2);
end;
end;
procedure TfrmReportPrt.cboDeviceChange(Sender: TObject);
begin
inherited;
with cboDevice do if ItemIndex > -1 then
begin
txtRightMargin.Text := Piece(Items[ItemIndex], '^', 4);
txtPageLength.Text := Piece(Items[ItemIndex], '^', 5);
DisplaySelectDevice;
end;
end;
procedure TfrmReportPrt.cmdOKClick(Sender: TObject);
var
ADevice, ErrMsg: string;
RemoteSiteID: string;
RemoteQuery: string;
aQualifier: string;
aReport: TStringList;
aCaption: string;
i: integer;
ListItem: TListItem;
MoreID: String; //Restores MaxOcc value
begin
inherited;
FReportText := CreateReportTextComponent(Self);
RemoteSiteID := '';
RemoteQuery := '';
MoreID := '';
aReport := TStringList.Create;
if uQualifier = '' then
aQualifier := piece(uRemoteType,'^',5) //Health Summary Type Report
else
begin
MoreID := ';' + Piece(uQualifier,';',3);
aQualifier := piece(uRemoteType,'^',5);
end;
with frmReports.TabControl1 do
if TabIndex > 0 then
begin
RemoteSiteID := TRemoteSite(Tabs.Objects[TabIndex]).SiteID;
RemoteQuery := TRemoteSite(Tabs.Objects[TabIndex]).CurrentReportQuery;
end;
if cboDevice.ItemID = '' then
begin
InfoBox(TX_NODEVICE, TX_NODEVICE_CAP, MB_OK);
Exit;
end;
if Piece(cboDevice.ItemID, ';', 1) = 'WIN' then
begin
if dlgWinPrinter.Execute then with FReportText do
begin
if uReportType = 'V' then
begin
case uQualifierType of
QT_IMAGING:
begin
for i := 0 to frmReports.lvReports.Items.Count - 1 do
if frmReports.lvReports.Items[i].Selected then
begin
ListItem := frmReports.lvReports.Items[i];
aQualifier := ListItem.SubItems[0];
ADevice := Piece(cboDevice.ItemID, ';', 2);
QuickCopy(GetFormattedReport(FReports, aQualifier,
Patient.DFN, uHSComponents, RemoteSiteID, RemoteQuery, uHState), FReportText);
aCaption := piece(uRemoteType,'^',4);
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
QT_NUTR:
begin
for i := 0 to frmReports.lvReports.Items.Count - 1 do
if frmReports.lvReports.Items[i].Selected then
begin
ListItem := frmReports.lvReports.Items[i];
aQualifier := ListItem.SubItems[0];
ADevice := Piece(cboDevice.ItemID, ';', 2);
QuickCopy(GetFormattedReport(FReports, aQualifier + MoreID,
Patient.DFN, uHSComponents, RemoteSiteID, RemoteQuery, uHState), FReportText);
aCaption := piece(uRemoteType,'^',4);
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
QT_HSCOMPONENT:
begin
if (length(piece(uHState,';',2)) > 0) then
begin
FReportText.Clear;
aReport.Clear;
CreatePatientHeader(aReport,piece(uRemoteType,'^',4));
QuickCopy(aReport, FReportText);
FindVType;
aCaption := piece(uRemoteType,'^',4) + ';1';
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end
else
begin
QuickCopy(GetFormattedReport(FReports, aQualifier + MoreID,
Patient.DFN, uHSComponents, RemoteSiteID, RemoteQuery, uHState), FReportText);
aCaption := piece(uRemoteType,'^',4);
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
QT_HSWPCOMPONENT:
begin
if (length(piece(uHState,';',2)) > 0) then
begin
FReportText.Clear;
aReport.Clear;
CreatePatientHeader(aReport,piece(uRemoteType,'^',4));
QuickCopy(aReport, FReportText);
FindVType;
aCaption := piece(uRemoteType,'^',4) + ';1';
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end
else
begin
QuickCopy(GetFormattedReport(FReports, aQualifier + MoreID,
Patient.DFN, uHSComponents, RemoteSiteID, RemoteQuery, uHState), FReportText);
aCaption := piece(uRemoteType,'^',4);
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
QT_PROCEDURES:
begin
for i := 0 to frmReports.lvReports.Items.Count - 1 do
if frmReports.lvReports.Items[i].Selected then
begin
ListItem := frmReports.lvReports.Items[i];
aQualifier := ListItem.SubItems[0];
ADevice := Piece(cboDevice.ItemID, ';', 2);
QuickCopy(GetFormattedReport(FReports, aQualifier,
Patient.DFN, uHSComponents, RemoteSiteID, RemoteQuery, uHState), FReportText);
aCaption := piece(uRemoteType,'^',4);
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
QT_SURGERY:
begin
for i := 0 to frmReports.lvReports.Items.Count - 1 do
if frmReports.lvReports.Items[i].Selected then
begin
ListItem := frmReports.lvReports.Items[i];
aQualifier := ListItem.SubItems[0];
ADevice := Piece(cboDevice.ItemID, ';', 2);
QuickCopy(GetFormattedReport(FReports, aQualifier,
Patient.DFN, uHSComponents, RemoteSiteID, RemoteQuery, uHState), FReportText);
aCaption := piece(uRemoteType,'^',4);
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
end;
end
else
begin
if (Pos('OR_ECS1',FReports)>0) or (Pos('OR_ECS2',FReports)>0) then
begin
ShowMsg('The Event Capture report can only be printed by Vista printer.');
Exit;
end;
aQualifier := Piece(uRemoteType,'^',5);
QuickCopy(GetFormattedReport(FReports, aQualifier,
Patient.DFN, uHSComponents, RemoteSiteID, RemoteQuery, uHState), FReportText);
aCaption := piece(uRemoteType,'^',4);
PrintWindowsReport(FReportText, PAGE_BREAK, aCaption, ErrMsg);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
end
else // if it's not a Win printer
begin
if uReportType = 'V' then
begin
case uQualifierType of
QT_IMAGING:
begin
for i := 0 to frmReports.lvReports.Items.Count - 1 do
if frmReports.lvReports.Items[i].Selected then
begin
ListItem := frmReports.lvReports.Items[i];
aQualifier := ListItem.SubItems[0];
ADevice := Piece(cboDevice.ItemID, ';', 2);
PrintReportsToDevice(piece(FReports,':',1), aQualifier + MoreID,
Patient.DFN, ADevice, ErrMsg, uHSComponents, RemoteSiteID, RemoteQuery, uHState);
ErrMsg := Piece(FReportText.Lines[0], U, 2);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
QT_NUTR:
begin
for i := 0 to frmReports.lvReports.Items.Count - 1 do
if frmReports.lvReports.Items[i].Selected then
begin
ListItem := frmReports.lvReports.Items[i];
aQualifier := ListItem.SubItems[0];
ADevice := Piece(cboDevice.ItemID, ';', 2);
PrintReportsToDevice(piece(FReports,':',1), aQualifier + MoreID,
Patient.DFN, ADevice, ErrMsg, uHSComponents, RemoteSiteID, RemoteQuery, uHState);
ErrMsg := Piece(FReportText.Lines[0], U, 2);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
QT_HSCOMPONENT:
begin
if (length(piece(uHState,';',2)) > 0) then
begin
FindVType;
aReport.Clear;
QuickCopy(FReportText.Lines, aReport);
ADevice := Piece(cboDevice.ItemID, ';', 2);
PrintVReports(ErrMsg, ADevice, piece(uRemoteType,'^',4),aReport);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end
else
begin
ADevice := Piece(cboDevice.ItemID, ';', 2);
PrintReportsToDevice(FReports, aQualifier + MoreID,
Patient.DFN, ADevice, ErrMsg, uHSComponents, RemoteSiteID, RemoteQuery, uHState);
ErrMsg := Piece(FReportText.Lines[0], U, 2);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
QT_HSWPCOMPONENT:
begin
if (length(piece(uHState,';',2)) > 0) then
begin
FindVType;
aReport.Clear;
QuickCopy(FReportText, aReport);
ADevice := Piece(cboDevice.ItemID, ';', 2);
PrintVReports(ErrMsg, ADevice, piece(uRemoteType,'^',4),aReport);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end
else
begin
ADevice := Piece(cboDevice.ItemID, ';', 2);
PrintReportsToDevice(FReports, aQualifier + MoreID,
Patient.DFN, ADevice, ErrMsg, uHSComponents, RemoteSiteID, RemoteQuery, uHState);
ErrMsg := Piece(FReportText.Lines[0], U, 2);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
QT_PROCEDURES:
begin
for i := 0 to frmReports.lvReports.Items.Count - 1 do
if frmReports.lvReports.Items[i].Selected then
begin
ListItem := frmReports.lvReports.Items[i];
aQualifier := ListItem.SubItems[0];
ADevice := Piece(cboDevice.ItemID, ';', 2);
PrintReportsToDevice(piece(FReports,':',1), aQualifier,
Patient.DFN, ADevice, ErrMsg, uHSComponents, RemoteSiteID, RemoteQuery, uHState);
ErrMsg := Piece(FReportText.Lines[0], U, 2);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
QT_SURGERY:
begin
for i := 0 to frmReports.lvReports.Items.Count - 1 do
if frmReports.lvReports.Items[i].Selected then
begin
ListItem := frmReports.lvReports.Items[i];
aQualifier := ListItem.SubItems[0];
ADevice := Piece(cboDevice.ItemID, ';', 2);
PrintReportsToDevice(piece(FReports,':',1), aQualifier + MoreID,
Patient.DFN, ADevice, ErrMsg, uHSComponents, RemoteSiteID, RemoteQuery, uHState);
ErrMsg := Piece(FReportText.Lines[0], U, 2);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
end;
end
else
begin
ADevice := Piece(cboDevice.ItemID, ';', 2);
aQualifier := Piece(uRemoteType,'^',5);
if (Pos('OR_ECS1',FReports)>0) or (Pos('OR_ECS2',FReports)>0) then
begin
uECSReport.ReportType := 'P';
uECSReport.PrintDEV := Piece(cboDevice.ItemID,';',1);
PrintECSReportToDevice(uECSReport);
end
else
begin
PrintReportsToDevice(FReports, aQualifier + MoreID,
Patient.DFN, ADevice, ErrMsg, uHSComponents, RemoteSiteID, RemoteQuery, uHState);
ErrMsg := Piece(FReportText.Lines[0], U, 2);
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TX_ERR_CAP, MB_OK);
end;
end;
end;
if chkDefault.Checked then SaveDefaultPrinter(Piece(cboDevice.ItemID, ';', 1));
User.CurrentPrinter := cboDevice.ItemID;
aReport.Free;
FReportText.Free;
Close;
end;
procedure TfrmReportPrt.cmdCancelClick(Sender: TObject);
begin
inherited;
Close;
end;
procedure TfrmReportPrt.cboDeviceNeedData(Sender: TObject;
const StartFrom: String; Direction, InsertAt: Integer);
begin
inherited;
cboDevice.ForDataUse(SubsetOfDevices(StartFrom, Direction));
end;
end.