Topic: Преобразование даты

Добрый день!
Помогите, пожалуйста. Использую скрипт для импорта данных из Excel. В файле Excel каждый раз приходится даты из формата (24.12.2024) переводить в формат (2024-24-12). Возможно ли, чтобы в этом скрипте даты конвертировались автоматически?
Приложил скриншот формы и ссылку на файл Excel (https://disk.yandex.ru/i/4vTvT8ztAsJ1qQ)
Спасибо.

//********************//

procedure Frm_Import_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
opendialog : Topendialog ;
begin
    opendialog := Topendialog.Create(Frm_Import) ;
    IF opendialog.execute Then
    Frm_Import.Edit1.Text := opendialog.filename ;
    opendialog.free;
end;

//********************//

procedure Frm_Import_Button2_OnClick (Sender: TObject; var Cancel: boolean);
var
Excel : Variant ;
Sheet : Variant ;
rows, columns : Integer;
MaxRow : Integer;
MaxCol : Integer;
result_string : string;
sql_string : string ;
irows : integer ;
begin
    Excel:=CreateOleObject('Excel.Application');
    //Excel.Visible:= True;
    Excel.Workbooks.Open(Frm_Import.Edit1.Text) ;
    Sheet := Excel.WorkSheets[1] ;
    MaxRow := Sheet.Usedrange.EntireRow.count ;
    MaxCol := sheet.Usedrange.EntireColumn.count;
    //special excel[row,column]
    irows := 0 ;
    For  rows := 2 To  MaxRow Do
    Begin
        For  columns := 1 To Maxcol Do
        Begin
            result_string := result_string + '"'+Excel.ActiveSheet.Cells[rows,columns].Value+'",'
        End;
        sql_string := 'INSERT IGNORE INTO Main(id,surname,firstname,patronymic,contract,doplata_cb,doplata,cert_num,ngroup,id_Program,active,data_deactive) values ('+
        copy(result_string,1, Length(result_string)-1)+');';
        Frm_Import.Memo1.Lines.Add(sql_string) ;
        irows := irows +1 ;
        result_string := '' ;
        sql_string := '' ;
        Frm_Import.Label1.Caption := IntToStr(irows);
    End;
// deleted past about kill excel
        Application.ProcessMessages;
        Excel.Workbooks.Close;
        KillTask('EXCEL.EXE');
end;

//********************//


procedure Frm_Import_Button3_OnClick (Sender: TObject; var Cancel: boolean);
var
i_sql : integer ;
begin
    For i_sql := 0 To Strtoint(Frm_Import.Label1.Caption) -1 Do
    Begin
        SQLExecute(Frm_Import.Memo1.Lines[i_sql]) ;
        Frm_Import.Label2.Caption := IntToStr(i_sql+1) ;
        Frm_Import.Label3.Caption := FormatFloat('0.00',(i_sql+1)/StrTOInt((Frm_Import.Label1.Caption))*100)+' %' ;
        Application.ProcessMessages;
    End;
    Application.ProcessMessages;
    FrmMain.Table_Main.dbUpdate;
    Frm_Import.Edit1.Clear;
    Frm_Import.Memo1.Clear;
    Frm_Import.Label1.Caption :='0';
    Frm_Import.Label2.Caption :='0';
    Frm_Import.Label3.Caption :='0.0%';
    Frm_Import.Close;
end;

//********************//

Post's attachments

Attachment icon Рисунок1.jpg 22.42 kb, 53 downloads since 2024-12-25 

Re: Преобразование даты

Вам пригодится функция, которая конвертирует дату в нужный формат, а остальные данные оставляет без изменений

function DateConv(AValue:string):string;
begin
  try
    Result := FormatDateTime('YYYY-MM-DD',StrToDate(AValue));
  except
    Result := AValue;
  end;
end;

используйте её здесь:

...
        For  columns := 1 To Maxcol Do
        Begin
            result_string := result_string + '"'+DateConv(Excel.ActiveSheet.Cells[rows,columns].Value)+'",'
        End;
...
Визуальное программирование: блог и телеграм-канал.

Re: Преобразование даты

Спасибо!
Я не специалист. Просто пытаюсь разобраться и что-то внедрять. Можете подсказать как объединить вашу функцию и часть кода?

k245 wrote:

Вам пригодится функция, которая конвертирует дату в нужный формат, а остальные данные оставляет без изменений

function DateConv(AValue:string):string;
begin
  try
    Result := FormatDateTime('YYYY-MM-DD',StrToDate(AValue));
  except
    Result := AValue;
  end;
end;

используйте её здесь:

...
        For  columns := 1 To Maxcol Do
        Begin
            result_string := result_string + '"'+DateConv(Excel.ActiveSheet.Cells[rows,columns].Value)+'",'
        End;
...

Re: Преобразование даты

Vickus wrote:

Спасибо!
Я не специалист. Просто пытаюсь разобраться и что-то внедрять. Можете подсказать как объединить вашу функцию и часть кода?

function DateConv(AValue:string):string;
begin
  try
    Result := FormatDateTime('YYYY-MM-DD',StrToDate(AValue));
  except
    Result := AValue;
  end;
end;

procedure Frm_Import_Button2_OnClick (Sender: TObject; var Cancel: boolean);
var
Excel : Variant ;
Sheet : Variant ;
rows, columns : Integer;
MaxRow : Integer;
MaxCol : Integer;
result_string : string;
sql_string : string ;
irows : integer ;
begin
    Excel:=CreateOleObject('Excel.Application');
    //Excel.Visible:= True;
    Excel.Workbooks.Open(Frm_Import.Edit1.Text) ;
    Sheet := Excel.WorkSheets[1] ;
    MaxRow := Sheet.Usedrange.EntireRow.count ;
    MaxCol := sheet.Usedrange.EntireColumn.count;
    //special excel[row,column]
    irows := 0 ;
    For  rows := 2 To  MaxRow Do
    Begin
        For  columns := 1 To Maxcol Do
        Begin
            result_string := result_string + '"'+DateConv(Excel.ActiveSheet.Cells[rows,columns].Value)+'",'
        End;
        sql_string := 'INSERT IGNORE INTO Main(id,surname,firstname,patronymic,contract,doplata_cb,doplata,cert_num,ngroup,id_Program,active,data_deactive) values ('+
        copy(result_string,1, Length(result_string)-1)+');';
        Frm_Import.Memo1.Lines.Add(sql_string) ;
        irows := irows +1 ;
        result_string := '' ;
        sql_string := '' ;
        Frm_Import.Label1.Caption := IntToStr(irows);
    End;
// deleted past about kill excel
        Application.ProcessMessages;
        Excel.Workbooks.Close;
        KillTask('EXCEL.EXE');
end;
Визуальное программирование: блог и телеграм-канал.

Re: Преобразование даты

Огромное Вам спасибо!
Все отлично работает!