git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.RemObjects@46 b6239004-a887-0f4b-9937-50029ccdca16
573 lines
17 KiB
ObjectPascal
573 lines
17 KiB
ObjectPascal
unit uDADataTableMasterLinkWizardForm_laz;
|
|
|
|
{$IFDEF MSWINDOWS}
|
|
{$I ..\DataAbstract.inc}
|
|
{$ELSE}
|
|
{$I ../DataAbstract.inc}
|
|
{$ENDIF}
|
|
|
|
interface
|
|
|
|
uses
|
|
LCLIntf,LResources,PropEdits,
|
|
SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
|
Dialogs, StdCtrls, ComCtrls, Buttons, uDADataTable, ExtCtrls;
|
|
|
|
type
|
|
|
|
{ TDADataTableMasterLinkWizard }
|
|
|
|
TDADataTableMasterLinkWizard = class(TForm)
|
|
Bevel1: TBevel;
|
|
Panel1: TPanel;
|
|
Image1: TImage;
|
|
Label1: TLabel;
|
|
Label2: TLabel;
|
|
pc_Pages: TPageControl;
|
|
ts_Welcome: TTabSheet;
|
|
Label3: TLabel;
|
|
Label4: TLabel;
|
|
Label24: TLabel;
|
|
Label25: TLabel;
|
|
Label26: TLabel;
|
|
Label27: TLabel;
|
|
Label28: TLabel;
|
|
Label29: TLabel;
|
|
ts_MasterSource: TTabSheet;
|
|
Label8: TLabel;
|
|
Label9: TLabel;
|
|
Label10: TLabel;
|
|
Label17: TLabel;
|
|
lbl_Params1: TLabel;
|
|
lbl_Params2: TLabel;
|
|
lbl_Method1: TLabel;
|
|
lbl_Method2: TLabel;
|
|
lbl_Params3: TLabel;
|
|
lbl_Where1: TLabel;
|
|
lbl_Where2: TLabel;
|
|
cb_DataSources: TComboBox;
|
|
rb_Where: TRadioButton;
|
|
rb_Params: TRadioButton;
|
|
rb_Method: TRadioButton;
|
|
ts_Fields: TTabSheet;
|
|
labMasterFields: TLabel;
|
|
labDetailFields: TLabel;
|
|
Label13: TLabel;
|
|
Label14: TLabel;
|
|
Label18: TLabel;
|
|
Label19: TLabel;
|
|
lbMaster: TListBox;
|
|
lbDetail: TListBox;
|
|
eMasterFields: TEdit;
|
|
eDetailFields: TEdit;
|
|
bbAddFieldMapping: TBitBtn;
|
|
BitBtn4: TBitBtn;
|
|
ts_MethodCall: TTabSheet;
|
|
labMasterFields2: TLabel;
|
|
labDataReqParams: TLabel;
|
|
Label7: TLabel;
|
|
Label20: TLabel;
|
|
Label21: TLabel;
|
|
lbMaster2: TListBox;
|
|
lbDataReqParams: TListBox;
|
|
mMappings: TMemo;
|
|
bbAddDataReqMapping: TBitBtn;
|
|
bbClearDataReqMapping: TBitBtn;
|
|
ts_Params: TTabSheet;
|
|
Label11: TLabel;
|
|
Label12: TLabel;
|
|
Label15: TLabel;
|
|
Label22: TLabel;
|
|
Label23: TLabel;
|
|
lbMaster3: TListBox;
|
|
lbParams: TListBox;
|
|
mParamsMappings: TMemo;
|
|
bbAddParamMappingXXX: TBitBtn;
|
|
bbClearParamMappingsXXX: TBitBtn;
|
|
ts_Finish: TTabSheet;
|
|
Label5: TLabel;
|
|
Label6: TLabel;
|
|
Panel2: TPanel;
|
|
btn_Finish: TBitBtn;
|
|
btn_Cancel: TBitBtn;
|
|
btn_Next: TBitBtn;
|
|
btn_Back: TBitBtn;
|
|
Label16: TLabel;
|
|
procedure bbAddFieldMappingClick(Sender: TObject);
|
|
procedure bbAddDataReqMappingClick(Sender: TObject);
|
|
procedure bbClearDataReqMappingClick(Sender: TObject);
|
|
procedure BitBtn4Click(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure bbAddParamMappingXXXClick(Sender: TObject);
|
|
procedure bbClearParamMappingsXXXClick(Sender: TObject);
|
|
procedure cb_DataSourcesChange(Sender: TObject);
|
|
procedure btn_FinishClick(Sender: TObject);
|
|
procedure OnFieldMappingChange(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure btn_BackClick(Sender: TObject);
|
|
procedure btn_NextClick(Sender: TObject);
|
|
private
|
|
fDataTable: TDADataTable;
|
|
fMasterSource: TDADataSource;
|
|
fDesigner: TPropertyEditorHook;
|
|
fInEnterPage: boolean;
|
|
fActiveControl: TWinControl;
|
|
fValues: TStrings;
|
|
fNextPage: integer;
|
|
fPreviousPage: integer;
|
|
procedure GetDataTables(const aName: ansistring);
|
|
function GetActiveControl: TWinControl;
|
|
procedure SetActiveControl(const Value: TWinControl);
|
|
function GetNextPage: integer;
|
|
function GetPreviousPage: integer;
|
|
procedure Initialize;
|
|
protected
|
|
function CleanPascalString(const aString: string): string;
|
|
procedure AfterEnterPage(aPage:TTabSheet; aMovingForward:boolean);
|
|
procedure OnLeavePage(aPage:TTabSheet; aMovingForward:boolean);
|
|
procedure OnEnterPage(aPage:TTabSheet; aMovingForward:boolean);
|
|
public
|
|
constructor Create(aOwner : TComponent); reintroduce;
|
|
property Values:TStrings read fValues;
|
|
function Execute:boolean; overload;
|
|
class function Execute(aOwner: TComponent): boolean; overload;
|
|
property ActiveControl: TWinControl read GetActiveControl write SetActiveControl;
|
|
property NextPage: integer read GetNextPage write fNextPage;
|
|
property PreviousPage: integer read GetPreviousPage write fPreviousPage;
|
|
class function ExecuteWizard(aDataTable: TDADataTable; aDesigner: TPropertyEditorHook): boolean;
|
|
end;
|
|
|
|
var
|
|
DADataTableMasterLinkWizard: TDADataTableMasterLinkWizard;
|
|
|
|
|
|
implementation
|
|
|
|
uses uROClasses, TypInfo, uDARemoteDataAdapter, uRODynamicRequest, uRODL;
|
|
|
|
procedure TrimNamesAndValues(aSL: TStrings);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
for i := 0 to aSL.Count - 1 do begin
|
|
aSL[i] := Trim(aSL.Names[i]) + aSL.NameValueSeparator + Trim(aSL.Values[aSL.Names[i]]);
|
|
|
|
end;
|
|
end;
|
|
|
|
{ TDataTableMasterLink }
|
|
|
|
class function TDADataTableMasterLinkWizard.ExecuteWizard(aDataTable: TDADataTable; aDesigner: TPropertyEditorHook): boolean;
|
|
begin
|
|
with TDADataTableMasterLinkWizard.Create(NIL) do try
|
|
fDataTable := aDataTable;
|
|
fDesigner := aDesigner;
|
|
Initialize();
|
|
result := Execute();
|
|
finally
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
constructor TDADataTableMasterLinkWizard.Create(aOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.Initialize;
|
|
var
|
|
i : integer;
|
|
begin
|
|
cb_DataSources.Items.Clear();
|
|
fDesigner.GetComponentNames(GetTypeData(TypeInfo(TDADataSource)), Self.GetDataTables);
|
|
if assigned(fDataTable.MasterSource) then begin
|
|
cb_DataSources.ItemIndex := cb_DataSources.Items.IndexOf(fDataTable.MasterSource.Name);
|
|
//lMasterTable := fDataTable.MasterSource.DataTable;
|
|
//Check(mast=NIL, 'MasterSource doesn''t point to a datatable');
|
|
end;
|
|
cb_DataSourcesChange(nil);
|
|
|
|
Caption := Format(Caption, [fDataTable.Name]);
|
|
|
|
eMasterFields.Text := fDataTable.MasterFields;
|
|
eDetailFields.Text := fDataTable.DetailFields;
|
|
mMappings.Lines.Text := fDataTable.MasterRequestMappings.Text;
|
|
mParamsMappings.Lines.Text := fDataTable.MasterParamsMappings.Text;
|
|
|
|
for i := 0 to (fDataTable.FieldCount-1) do
|
|
lbDetail.Items.Add(fDataTable.Fields[i].Name);
|
|
|
|
for i := 0 to (fDataTable.Params.Count-1) do
|
|
lbParams.Items.Add(fDataTable.Params[i].Name);
|
|
|
|
case fDataTable.MasterMappingMode of
|
|
mmParams: rb_Params.Checked := true;
|
|
mmDataRequest: rb_Method.Checked := true;
|
|
mmWhere: rb_Where.Checked := true;
|
|
end;
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.GetDataTables(const aName: ansistring);
|
|
var
|
|
lDataSource: TDADataSource;
|
|
begin
|
|
lDataSource := fDesigner.GetComponent(aName) as TDADataSource;
|
|
if assigned(lDataSource.DataTable) and (lDataSource.DataTable <> fDataTable) then
|
|
cb_DataSources.Items.Add(aName);
|
|
end;
|
|
|
|
function TDADataTableMasterLinkWizard.CleanPascalString(const aString: string
|
|
): string;
|
|
begin
|
|
result := aString;
|
|
result := StringReplace(result,'''','''''',[rfReplaceAll]); { replace quotes with double quotes }
|
|
result := StringReplace(result,#13#10,'''#13#10''',[rfReplaceAll]);
|
|
result := ''''+result+'''';
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.cb_DataSourcesChange(Sender: TObject);
|
|
var
|
|
lMasterTable: TDADataTable;
|
|
lCall: TRODynamicRequest;
|
|
i: integer;
|
|
begin
|
|
fMasterSource := fDesigner.GetComponent(cb_DataSources.Text) as TDADataSource;
|
|
if assigned(fMasterSource) and assigned(fMasterSource.DataTable) then begin
|
|
lMasterTable := fMasterSource.DataTable;
|
|
|
|
rb_Params.Enabled := fDataTable.Params.Count > 0;
|
|
lbl_Params1.Enabled := rb_Params.Enabled;
|
|
lbl_Params2.Enabled := rb_Params.Enabled;
|
|
|
|
rb_Method.Enabled := assigned(lMasterTable.RemoteDataAdapter) and
|
|
assigned(fDataTable.RemoteDataAdapter) and
|
|
(lMasterTable.RemoteDataAdapter <> fDataTable.RemoteDataAdapter);
|
|
lbl_Method1.Enabled := rb_Method.Enabled;
|
|
|
|
if (not rb_Params.Enabled and rb_Params.Checked) or (not rb_Method.Enabled and rb_Method.Checked) then
|
|
rb_Where.Checked := true;
|
|
|
|
lbMaster.Items.Clear();
|
|
lbMaster2.Items.Clear();
|
|
lbMaster3.Items.Clear();
|
|
for i := 0 to (lMasterTable.FieldCount-1) do begin
|
|
lbMaster.Items.Add(lMasterTable.Fields[i].Name);
|
|
lbMaster2.Items.Add(lMasterTable.Fields[i].Name);
|
|
lbMaster3.Items.Add(lMasterTable.Fields[i].Name);
|
|
end;
|
|
|
|
if assigned(fDataTable.RemoteDataAdapter) then begin
|
|
lCall := (fDataTable.RemoteDataAdapter as TDARemoteDataAdapter).GetDataCall;
|
|
lbDataReqParams.Items.Clear();
|
|
for i := 0 to lCall.Params.Count-1 do
|
|
if lCall.Params[i].Flag in [fIn, fInOut] then
|
|
lbDataReqParams.Items.Add(lCall.Params[i].Name);
|
|
end
|
|
else begin
|
|
lbDataReqParams.Enabled := false;
|
|
end;
|
|
|
|
if pc_Pages.ActivePage = ts_MasterSource then
|
|
btn_Next.Enabled := (rb_Where.Enabled and rb_Where.Checked) or (rb_Params.Enabled and rb_Params.Checked) or (rb_Method.Enabled and rb_Method.Checked);
|
|
end
|
|
else begin
|
|
if pc_Pages.ActivePage = ts_MasterSource then
|
|
btn_Next.Enabled := false;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TDADataTableMasterLinkWizard.bbAddFieldMappingClick(Sender: TObject);
|
|
var x : integer;
|
|
begin
|
|
if (lbMaster.SelCount=0) or (lbMaster.SelCount<>lbDetail.SelCount) then begin
|
|
Beep;
|
|
Exit;
|
|
end;
|
|
|
|
for x := 0 to (lbMaster.Items.Count-1) do
|
|
if lbMaster.Selected[x] then begin
|
|
if (eMasterFields.Text<>'')
|
|
then eMasterFields.Text := eMasterFields.Text+';';
|
|
eMasterFields.Text := eMasterFields.Text+lbMaster.Items[x];
|
|
end;
|
|
|
|
for x := 0 to (lbDetail.Items.Count-1) do
|
|
if lbDetail.Selected[x] then begin
|
|
if (eDetailFields.Text<>'')
|
|
then eDetailFields.Text := eDetailFields.Text+';';
|
|
eDetailFields.Text := eDetailFields.Text+lbDetail.Items[x];
|
|
end;
|
|
OnFieldMappingChange(nil);
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.bbAddDataReqMappingClick(Sender: TObject);
|
|
var x, i : integer;
|
|
s : TStringList;
|
|
begin
|
|
if (lbMaster2.SelCount=0) or (lbDataReqParams.SelCount<>lbMaster2.SelCount) then begin
|
|
Beep;
|
|
Exit;
|
|
end;
|
|
|
|
s := TStringList.Create;
|
|
try
|
|
for x := 0 to (lbDataReqParams.Items.Count-1) do
|
|
if lbDataReqParams.Selected[x] then s.Add(lbDataReqParams.Items[x]+'=');
|
|
|
|
i := 0;
|
|
for x := 0 to (lbMaster2.Items.Count-1) do
|
|
if lbMaster2.Selected[x] then begin
|
|
s[i] := s[i]+lbMaster2.Items[x];
|
|
Inc(i);
|
|
end;
|
|
|
|
mMappings.Lines.AddStrings(s);
|
|
finally
|
|
s.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.bbClearDataReqMappingClick(Sender: TObject);
|
|
begin
|
|
mMappings.Lines.Clear
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.BitBtn4Click(Sender: TObject);
|
|
begin
|
|
eMasterFields.Text := '';
|
|
eDetailFields.Text := '';
|
|
OnFieldMappingChange(nil);
|
|
end;
|
|
|
|
|
|
procedure TDADataTableMasterLinkWizard.OnFieldMappingChange(
|
|
Sender: TObject);
|
|
begin
|
|
if pc_Pages.ActivePage = ts_Fields then
|
|
btn_Next.Enabled := (eMasterFields.Text <> '') and (eDetailFields.Text <> '');
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.FormDestroy(Sender: TObject);
|
|
begin
|
|
FreeAndNil(fValues);
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.btn_BackClick(Sender: TObject);
|
|
begin
|
|
if pc_Pages.ActivePageIndex > 0 then begin
|
|
fInEnterPage := true;
|
|
try
|
|
OnLeavePage(pc_Pages.Pages[pc_Pages.ActivePageIndex],false);
|
|
OnEnterPage(pc_Pages.Pages[PreviousPage],false);
|
|
finally
|
|
fInEnterPage := false;
|
|
end;
|
|
pc_Pages.ActivePageIndex := PreviousPage;
|
|
if Assigned(fActiveControl) then begin
|
|
inherited ActiveControl := fActiveControl;
|
|
fActiveControl := nil;
|
|
end;
|
|
end;
|
|
fNextPage := -1;
|
|
fPreviousPage := -1;
|
|
AfterEnterPage(pc_Pages.ActivePage, false);
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.btn_NextClick(Sender: TObject);
|
|
begin
|
|
if pc_Pages.ActivePageIndex+1 < pc_Pages.PageCount then begin
|
|
fInEnterPage := true;
|
|
try
|
|
OnLeavePage(pc_Pages.Pages[pc_Pages.ActivePageIndex],true);
|
|
OnEnterPage(pc_Pages.Pages[NextPage],true);
|
|
finally
|
|
fInEnterPage := false;
|
|
end;
|
|
fPreviousPage := pc_Pages.ActivePageIndex;
|
|
pc_Pages.ActivePageIndex := NextPage;
|
|
if Assigned(fActiveControl) then begin
|
|
inherited ActiveControl := fActiveControl;
|
|
fActiveControl := nil;
|
|
end;
|
|
end;
|
|
fNextPage := -1;
|
|
AfterEnterPage(pc_Pages.ActivePage, true);
|
|
end;
|
|
|
|
function TDADataTableMasterLinkWizard.GetActiveControl: TWinControl;
|
|
begin
|
|
if Assigned(fActiveControl) then
|
|
result := fActiveControl
|
|
else
|
|
result := inherited ActiveControl;
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.SetActiveControl(const Value: TWinControl
|
|
);
|
|
begin
|
|
if fInEnterPage then begin
|
|
fActiveControl := Value;
|
|
end
|
|
else begin
|
|
inherited ActiveControl := Value;
|
|
fActiveControl := nil;
|
|
end;
|
|
end;
|
|
|
|
function TDADataTableMasterLinkWizard.GetNextPage: integer;
|
|
begin
|
|
Result := fNextPage;
|
|
if result = -1 then result := pc_Pages.ActivePageIndex+1;
|
|
end;
|
|
|
|
function TDADataTableMasterLinkWizard.GetPreviousPage: integer;
|
|
begin
|
|
Result := fPreviousPage;
|
|
if result = -1 then result := pc_Pages.ActivePageIndex-1;
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.FormCreate(Sender: TObject);
|
|
var
|
|
i: integer;
|
|
begin
|
|
for i := 0 to ComponentCount-1 do begin
|
|
if Components[i] is TTabSheet then TTabSheet(Components[i]).TabVisible := false;
|
|
end;
|
|
|
|
fValues := TStringList.Create();
|
|
|
|
Height := Height-16;
|
|
pc_Pages.ActivePageIndex := 0;
|
|
OnEnterPage(pc_Pages.Pages[0],true);
|
|
|
|
fNextPage := -1;
|
|
fPreviousPage := -1;
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.bbAddParamMappingXXXClick(Sender: TObject);
|
|
var x, i : integer;
|
|
s : TStringList;
|
|
begin
|
|
if (lbMaster3.SelCount=0) or (lbParams.SelCount<>lbMaster3.SelCount) then begin
|
|
Beep;
|
|
Exit;
|
|
end;
|
|
|
|
s := TStringList.Create;
|
|
try
|
|
for x := 0 to (lbParams.Items.Count-1) do
|
|
if lbParams.Selected[x] then s.Add(lbParams.Items[x]+'=');
|
|
|
|
i := 0;
|
|
for x := 0 to (lbMaster3.Items.Count-1) do
|
|
if lbMaster3.Selected[x] then begin
|
|
s[i] := s[i]+lbMaster3.Items[x];
|
|
Inc(i);
|
|
end;
|
|
|
|
mParamsMappings.Lines.AddStrings(s);
|
|
finally
|
|
s.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.bbClearParamMappingsXXXClick(Sender: TObject);
|
|
begin
|
|
mParamsMappings.Lines.Clear
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.btn_FinishClick(Sender: TObject);
|
|
begin
|
|
fDataTable.MasterSource := fMasterSource;
|
|
fDataTable.MasterFields := eMasterFields.Text;
|
|
fDataTable.DetailFields := eDetailFields.Text;
|
|
|
|
TrimNamesAndValues(mMappings.Lines);
|
|
TrimNamesAndValues(mParamsMappings.Lines);
|
|
|
|
fDataTable.MasterRequestMappings.Text := mMappings.Lines.Text;
|
|
fDataTable.MasterParamsMappings.Text := mParamsMappings.Lines.Text;
|
|
|
|
if rb_Where.Checked then
|
|
fDataTable.MasterMappingMode := mmWhere
|
|
else if rb_Params.Checked then
|
|
fDataTable.MasterMappingMode := mmParams
|
|
else if rb_Method.Checked then
|
|
fDataTable.MasterMappingMode := mmDataRequest;
|
|
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.AfterEnterPage(aPage: TTabSheet;
|
|
aMovingForward: boolean);
|
|
begin
|
|
if (aPage = ts_MasterSource) and aMovingForward then begin
|
|
cb_DataSourcesChange(nil);
|
|
end
|
|
else if (aPage = ts_Fields) and aMovingForward then begin
|
|
OnFieldMappingChange(nil);
|
|
end;
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.OnLeavePage(aPage: TTabSheet;
|
|
aMovingForward: boolean);
|
|
begin
|
|
if (aPage = ts_Fields) and aMovingForward then begin
|
|
if rb_Where.Checked then NextPage := ts_Finish.PageIndex
|
|
else if rb_Params.Checked then NextPage := ts_Params.PageIndex
|
|
else if rb_Method.Checked then NextPage := ts_MethodCall.PageIndex;
|
|
end
|
|
else if (aPage = ts_Params) or (aPage = ts_MethodCall) then begin
|
|
NextPage := ts_Finish.PageIndex;
|
|
PreviousPage := ts_Fields.PageIndex;
|
|
end;
|
|
end;
|
|
|
|
procedure TDADataTableMasterLinkWizard.OnEnterPage(aPage: TTabSheet;
|
|
aMovingForward: boolean);
|
|
begin
|
|
{$IFDEF FPC}
|
|
if aMovingForward then btn_Finish.Visible := false else // for prevent warnings
|
|
{$ENDIF}
|
|
btn_Finish.Visible := false;
|
|
btn_Next.Visible := true;
|
|
if aPage = ts_Welcome then begin
|
|
btn_Back.Enabled := false;
|
|
btn_Next.Enabled := true;
|
|
ActiveControl := btn_Next;
|
|
end
|
|
else if aPage = ts_Finish then begin
|
|
try
|
|
btn_Finish.Visible := true;
|
|
btn_Finish.Enabled := true;
|
|
btn_Next.Visible := false;
|
|
ActiveControl := btn_Finish;
|
|
finally
|
|
end;
|
|
end
|
|
else { default for custom added pages } begin
|
|
btn_Back.Enabled := true;
|
|
btn_Next.Enabled := true;
|
|
end;
|
|
end;
|
|
|
|
function TDADataTableMasterLinkWizard.Execute: boolean;
|
|
begin
|
|
result := (ShowModal() = 1); // idOk=1
|
|
end;
|
|
|
|
class function TDADataTableMasterLinkWizard.Execute(aOwner: TComponent
|
|
): boolean;
|
|
begin
|
|
with self.Create(aOwner) do try
|
|
result := Execute();
|
|
finally
|
|
Free();
|
|
end;
|
|
end;
|
|
|
|
initialization
|
|
{$I uDADataTableMasterLinkWizardForm_laz.lrs}
|
|
end.
|