07. november 2002 - 18:06
#5
Følgende "Snip" er fra et system vi bruger til at modtage vare/prisopdateringer fra vores Leverandører. Den indlæser den (Excel) fil som leverandøren sender og de "linier" den ikke kan fortolke skrives til et "fejl-Excel-fil":
<SNIP>
procedure TImpFilterFileDiasInternExcelItems.ProcessFile(
ImportOptions: TImportOptions);
var
InputFile: TextFile;
//-
ErrorFileName: String;
ErrorFileCreated: Boolean;
ErrorLine: Boolean;
ErrorLineNo: Integer;
//-
InputLine: String;
TempExportRecord: TTempExportRecord;
FieldRecordType: Integer;
FieldEAN: String;
FieldVareTekst: String;
FieldKostPris: Currency;
FieldKolli: Integer;
FieldSalgsPris: Currency;
FieldAnbrudsPris: Currency;
FieldVaregruppeIsenkram: Integer;
FieldVaregruppeEL: Integer;
FieldLevVareNr: String;
FieldHoejde: Integer;
FieldBredde: Integer;
FieldDybde: Integer;
FieldKaedeOpdatPSEL: String;
FieldKaedeOpdatKopKande: String;
FieldKaedeOpdatAktive: String;
qArtInGroup: TQuery;
OrderGroup: TOrderGroup;
XlsApp: OleVariant;
XlsDataWbk: OleVariant;
XlsDataSheet: OleVariant;
XlsErrorWbk: OleVariant;
XlsErrorSheet: OleVariant;
Row,Col: Integer;
Value: String;
CountEOF: Integer;
TestLine: String;
Function LogicalEOF: Boolean;
var
I: Integer;
Value: String;
TmpValue: String;
begin
TmpValue := '';
for I := 1 to 16 do
begin
Value := XlsDataSheet.Cells[Row,I].Value;
TmpValue := TmpValue + Value;
end;
if (StrTrimCharRight(StrTrimCharLeft(TmpValue,' '),' ') = '') then Inc(CountEOF)
else CountEOF := 0;
Result := (CountEOF > 10);
end;
begin
//---
ErrorFileCreated := False;
ErrorFileName := ImportOptions.GenerateErrorFileName(Now, 'XLS');
ImportOptions.ErrorFileName := '';
ErrorLineNo := 1;
//---
XlsApp := CreateOleObject('Excel.Application');
try
XlsDataWbk := XlsApp.WorkBooks.Open(ImportOptions.ImportFile1);
XlsDataSheet := XlsApp.WorkBooks[1].WorkSheets[1];
try
Row := 1;
CountEOF := 0;
while not LogicalEOF do
begin
ErrorLine := False;
Value := XlsDataSheet.Cells[Row,1].Value;
TestLine := Value;
FieldRecordType := StrToIntSafe(Value);
Value := XlsDataSheet.Cells[Row,2].Value;
TestLine := TestLine + Value;
FieldEAN := StrTrimCharRight(StrTrimCharLeft(StrTrimCharLeft(Value,'0'),' '),' ');
Value := XlsDataSheet.Cells[Row,3].Value;
TestLine := TestLine + Value;
FieldVareTekst := StrTrimCharRight(StrTrimCharLeft(Value,' '),' ');
Value := XlsDataSheet.Cells[Row,4].Value;
TestLine := TestLine + Value;
FieldKostPris := StrToFloatSafe(Value) / 100.0;
Value := XlsDataSheet.Cells[Row,5].Value;
TestLine := TestLine + Value;
FieldKolli := StrToIntSafe(Value);
Value := XlsDataSheet.Cells[Row,6].Value;
TestLine := TestLine + Value;
FieldSalgsPris := StrToFloatSafe(Value) / 100.0;
if ImportOptions.UseRounding then
begin
FieldSalgsPris := ImportOptions.PriceRoundSuppliers.RoundPrice(ImportOptions.SupplierId, FieldSalgsPris);
end;
Value := XlsDataSheet.Cells[Row,7].Value;
TestLine := TestLine + Value;
FieldAnbrudsPris := StrToFloatSafe(Value) / 100.0;
Value := XlsDataSheet.Cells[Row,8].Value;
TestLine := TestLine + Value;
FieldVaregruppeIsenkram := StrToIntSafe(Value);
Value := XlsDataSheet.Cells[Row,9].Value;
TestLine := TestLine + Value;
FieldVaregruppeEL := StrToIntSafe(Value);
Value := XlsDataSheet.Cells[Row,10].Value;
TestLine := TestLine + Value;
FieldLevVareNr := StrTrimCharRight(StrTrimCharLeft(Value,' '),' ');
Value := XlsDataSheet.Cells[Row,11].Value;
TestLine := TestLine + Value;
FieldHoejde := StrToIntSafe(Value);
Value := XlsDataSheet.Cells[Row,12].Value;
TestLine := TestLine + Value;
FieldBredde := StrToIntSafe(Value);
Value := XlsDataSheet.Cells[Row,13].Value;
TestLine := TestLine + Value;
FieldDybde := StrToIntSafe(Value);
Value := XlsDataSheet.Cells[Row,14].Value;
TestLine := TestLine + Value;
FieldKaedeOpdatPSEL := AnsiUpperCase(Value);
Value := XlsDataSheet.Cells[Row,15].Value;
TestLine := TestLine + Value;
FieldKaedeOpdatKopKande := AnsiUpperCase(Value);
Value := XlsDataSheet.Cells[Row,16].Value;
TestLine := TestLine + Value;
FieldKaedeOpdatAktive := AnsiUpperCase(Value);
TestLine := StrRemoveChars(TestLine, [' ']);
if Length(TestLine) > 0 then
begin
if HasMandatoryFields(FieldRecordType, FieldEAN, FieldVareTekst, FieldKostPris, FieldKolli,
FieldSalgsPris, FieldAnbrudsPris, FieldVaregruppeIsenkram,
FieldVaregruppeEL, FieldLevVareNr, FieldHoejde, FieldBredde,
FieldDybde, FieldKaedeOpdatPSEL, FieldKaedeOpdatKopKande,
FieldKaedeOpdatAktive) then
begin
TempExportRecord := ImportOptions.ImpFilter.TempExportBuffer.FindEAN(FieldEAN);
if Assigned(TempExportRecord) then
begin
ImportOptions.MemoProgress.Lines.Add('Gen-Indlæser oplysninger for: '+FieldEAN);
end else begin
TempExportRecord := ImportOptions.ImpFilter.TempExportBuffer.AddEAN(FieldEAN);
ImportOptions.MemoProgress.Lines.Add('Indlæser oplysninger for: '+FieldEAN);
end;
with TempExportRecord do
begin
Recordtype := FieldRecordType;
Varetekst := FieldVareTekst;
Kostpris := FieldKostPris;
Kolli := FieldKolli;
Salgspris := FieldSalgsPris;
if ImportOptions.UseRounding then
begin
SalgsPris := ImportOptions.PriceRoundSuppliers.RoundPrice(ImportOptions.SupplierId, SalgsPris);
end;
Anbrudspris := FieldAnbrudsPris;
VaregruppeIsenkram := FieldVaregruppeIsenkram;
VaregruppeEL := FieldVaregruppeEL;
LevVareNr := FieldLevVareNr;
Hoejde := FieldHoejde;
Bredde := FieldBredde;
Dybde := FieldDybde;
KaedeOpdatPSEL := (AnsiUpperCase(FieldKaedeOpdatPSEL) = 'J');
KaedeOpdatKopKande := (AnsiUpperCase(FieldKaedeOpdatKopKande) = 'J');
KaedeOpdatAktive := (AnsiUpperCase(FieldKaedeOpdatAktive) = 'J');
if ImportOptions.UseExcludeArticleGroups then
begin
qArtInGroup := TQuery.Create(Nil);
qArtInGroup.DatabaseName := DataModuleSBoss2Paradox.dbSBoss2Paradox.DatabaseName;
qArtInGroup.SQL.Text := 'SELECT ARTICLES.OrderGroup,' + #13#10 +
'ArticlesPLUNumbers.PLU' + #13#10 +
'FROM ArticlesPLUNumbers' + #13#10 +
'INNER JOIN ARTICLES ON (ArticlesPLUNumbers.MasterId = ARTICLES.ArticleId)' + #13#10 +
'WHERE ArticlesPLUNumbers.PLU = ' + Chr(39) +
StrStripNonNumberChars(FieldEAN) + Chr(39);
try
qArtInGroup.Open;
if qArtInGroup.RecordCount > 0 then begin
OrderGroup := TOrderGroup(ImpFixSettings.OrderGroups.LocateOrderGroupID(qArtInGroup.FieldByName('OrderGroup').AsInteger));
if Assigned(OrderGroup) then
begin
if OrderGroup.Checked then ExcludeCode := 1;
end;
end;
finally
qArtInGroup.Close;
qArtInGroup.Free;
end;
end;
end;
end else ErrorLine := True;
end;
if ErrorLine then
begin
if not(ErrorFileCreated) then
begin
ErrorFileCreated := True;
XlsErrorWbk := XlsApp.WorkBooks.Add;
XlsErrorSheet := XlsApp.WorkBooks[2].WorkSheets[1];
ImportOptions.ErrorFileName := ErrorFileName;
end;
for Col := 1 to 16 do
begin
Value := XlsDataSheet.Cells[Row,Col].Value;
XlsErrorSheet.Cells[ErrorLineNo,Col].Value := Value;
{
XlsErrorSheet.Cells[ErrorLineNo,Col].Font.Bold := XlsDataSheet.Cells[Row,Col].Font.Bold;
XlsErrorSheet.Cells[ErrorLineNo,Col].Font.Size := XlsDataSheet.Cells[Row,Col].Font.Size;
XlsErrorSheet.Cells[ErrorLineNo,Col].Font.Color := XlsDataSheet.Cells[Row,Col].Font.Color;
XlsErrorSheet.Cells[ErrorLineNo,Col].Interior.Color := XlsDataSheet.Cells[Row,Col].Interior.Color;
XlsErrorSheet.Cells[ErrorLineNo,Col].NumberFormat := XlsDataSheet.Cells[Row,Col].NumberFormat;
}
end;
inc(ErrorLineNo);
end;
Inc(Row);
end;
finally
if ErrorFileCreated then
begin
XlsErrorWbk.SaveAs(ErrorFileName,,,,,,,,);
ImportOptions.MemoProgress.Lines.Add('***** FEJL***** : '+ErrorFileName);
end;
XlsApp.WorkBooks.Close;
end;
finally
XlsApp.Application.Quit;
end;
end;
</SNIP>