Последняя версия DataExpress 3 beta от 20 апреля 2018 года. Скачать. Энциклопедия DX.

импорт из *.ods;*.xls;*.csv;*.xlsx

Все о том как сделать что-то с помощью скриптов.
rausNT
Опытный
Сообщения: 344
Зарегистрирован: Чт авг 24, 2017 9:23 am

Re: импорт из ods

Сообщение rausNT » Пт мар 16, 2018 11:41 am

jurist23rus писал(а):Что конкретно вы не можете найти по синтаксису?


конкретно наверное ничего, хотелось бы простой справочник по синтаксису, допустим как тут https://developer.android.com/reference/android/app/AlertDialog.html
без IDE может и можно кодить, но тогда весь синтаксис надо руками прописывать, а для этого его нужно или знать, или знать где быстро подсмотреть.

rausNT
Опытный
Сообщения: 344
Зарегистрирован: Чт авг 24, 2017 9:23 am

Re: импорт из .csv

Сообщение rausNT » Пт мар 16, 2018 11:43 am

jurist23rus писал(а):вызывать sleep.


вот это подойдет?
neitri писал(а):Aplication.ProcessMessages не поможет. Т.к. его можно вызвать до или после что роли по сути не играет.
Я тут бъюсь со следующим кодом.

Код: Выделить всё

procedure SleepTimer(Sender:TObject);
begin
  TTimer(Sender).Enabled:=false;
end;

procedure Sleep(Milisecond:cardinal);
var
  timer:TTimer;
begin
  Timer:=TTimer.Create(MainWindow.Components[0]);
  Timer.Enabled:=false;
  Timer.Interval:=Milisecond;
  Timer.OnTimer:=@SleepTimer;
  Timer.Enabled:=True;
  while Timer.Enabled do
    Application.ProcessMessages;
  Timer.free;
end; 

Без Application.ProcessMessages; оно почему то не работает. А с ним время может быть больше, например если подвигать окно.

jurist23rus
Эксперт
Сообщения: 2136
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: импорт из .csv

Сообщение jurist23rus » Пт мар 16, 2018 11:57 am

Вам же просто нужна задержка, пока выполнится сторонний скрипт? Делайте её как вам больше нравиться sleep или Timer.
Aplication.ProcessMessages - это немного о другом.
Destiny is a very convenient word for those who never take decisions.

rausNT
Опытный
Сообщения: 344
Зарегистрирован: Чт авг 24, 2017 9:23 am

Re: импорт из .csv

Сообщение rausNT » Пт мар 16, 2018 1:12 pm

собственно весь скрипт :

Код: Выделить всё

// Разбить строку на части.
procedure SplitStr(S: String; D: Char; SL: TStringList);
var
  p: Integer;
begin
  SL.Clear;
  p := Pos(D, S);
  while p > 0 do
  begin
    SL.Add(Copy(S, 1, p - 1));
    Delete(S, 1, p);
    p := Pos(D, S);
  end;
  if S <> '' then SL.Add(S);
end;

// диалог импорта файла
function ImportCsvDialog: String;
begin
  Result := '';
  with TOpenDialog.Create(nil) do
  begin
    Title := 'Импорт данных из CSV';
   // Filter := 'Файлы CSV|*.csv';
    Filter := 'Файлы ODS|*.ods';
    if Execute then
      Result := FileName;
    Free;
  end;
end;

// задержка для отработки скрипта (не понимаю как это работает)
procedure Sleep(milliseconds: Cardinal); external 'Sleep@kernel32.dll stdcall delayload';



procedure Button7Click(Sender: TObject);
var
  FileName: String;
  Data, SL: TStringList;
  S, Search: String;
  i, rnd,  total_imported, num_date_column, num_sum_column, num_number_column: Integer;
//  Goods: TdxForm;

  begin

  total_imported := 0;   // скидываю в ноль количество импортируемых записей

  FileName := ImportCsvDialog;

  if FileName = '' then Exit;

  rnd := random (1000) + 1000; // для уникальности имени импортируемого файла

  // выполняется VBA скрипт конвертации ods в csv
  ShellExecute('open','C:\VBA\XlsToCsv.vbs', FileName   + ' import' + IntToStr(rnd) + '.csv', ExtractFilePath(FileName), 1 );

  // ждем пока отработает скрипт
   Sleep(1000);

   // не уверен что это работает
   if FileExists((ExtractFilePath(FileName) + 'import' + IntToStr(rnd) + '.csv')) = false then
   begin
        MsgBox('Внимание!', 'Почему-то файл не конвертировался. Импорт не возможен.');
    Exit;
   end;

   num_number_column := -1; // не знаю как правильно сравнивать с null
   num_date_column := -1;
   num_sum_column  := -1;

  // Нужно убедится, что родительская форма в редактировании. Иначе сообщаем
  // об этом и прерываем операцию.


  if (Self.State <> dsEdit) and (Self.State <> dsInsert) then
  begin
    MsgBox('Внимание!', 'Родительская запись должна быть в режиме изменения ' +
      'прежде чем Вы начнете импорт.');
    Exit;
  end;

  SL := TStringList.Create;
  Data := TStringList.Create;
  Data.LoadFromFile(ExtractFilePath(FileName) + 'import' + IntToStr(rnd) + '.csv');

    S := Data[0];
    SplitStr(S, ';', SL);

    // поиск нужных столбцов, т.к. пользователь может их расставить как угодно
    for i := 0 to SL.Count - 1 do
    begin

    if WinCPToUtf8(SL[i]) = 'Дата документа' then
    begin
    num_date_column := i;
 //   MsgBox('Внимание!', 'Дата документа найдена. Строка № ' + IntToStr(num_date_column));
    end;

    if WinCPToUtf8(SL[i]) = '№ документа' then
    begin
    num_number_column := i;
  //  MsgBox('Внимание!', '№ документа найден. Строка № ' + IntToStr(num_number_column));
    end;

    if WinCPToUtf8(SL[i]) = 'Приход' then
    begin
    num_sum_column := i;
 //   MsgBox('Внимание!', 'Приход найден. Строка № ' + IntToStr(num_sum_column));
    end;


    end;

    // если в файле нет нужных заголовков таблицы сообщаем об этом пользователю и выходим из скрипта
      if (num_sum_column = -1) then
      begin
      MsgBox('Внимание!', 'В выбранном файле ' + FileName + ' отсутствует колонка "Приход". Пожалуйста выберите правильный файл.');
      Exit;
      end;

      if (num_number_column = -1) then
      begin
      MsgBox('Внимание!', 'В выбранном файле ' + FileName + ' отсутствует колонка "№ документа". Пожалуйста выберите правильный файл.');
      Exit;
      end;

      if (num_date_column = -1) then
      begin
      MsgBox('Внимание!', 'В выбранном файле ' + FileName + ' отсутствует колонка "Дата документа". Пожалуйста выберите правильный файл.');
      Exit;
      end;

  // собственно цикл импорта

  for i := 1 to Data.Count - 1 do
    begin

    S := Data[i];
    SplitStr(S, ';', SL);


   Search := WinCPToUtf8(SL[num_number_column]) +  WinCPToUtf8(SL[num_sum_column]) + WinCPToUtf8(SL[num_date_column])  ;

  // проверяем что такой строки еще не импортировалось
  if not  deistvia.Locate('контроль_уникальности_платежа', Search, []) then
   begin

   // проверка на null необходима, т.к. в таблице подбит итог
  if (SL[num_date_column] <> nil) then
    begin
    deistvia.Append;
    deistvia['номер платежки']  := SL[num_number_column];
    deistvia['сумма платежа'] := SL[num_sum_column];
    deistvia['дата платежа'] := SL[num_date_column];
    deistvia['описание действия'] := WinCPToUtf8(S);
    deistvia['Какое действие'] :=  'Удержание ФССП';
    deistvia['Затрачено времени (минут)'] :=  5;
    deistvia['контроль_уникальности_платежа'] := SL[num_number_column] +  SL[num_sum_column] + SL[num_date_column];
    total_imported := total_imported + 1;
    deistvia.Post;

    end;
    end;
    end;

  SL.Free;
  Data.Free;
  MsgBox('Импорт успешен', 'Импорт выполнен успешно! Импортировано ' + IntToStr(num_sum_column) + ' записей');

  end;

procedure Form_Create;
begin
dxButton7.OnClick := @Button7Click;

end;   


для работы необходим VBA скрипт (во вложении)
Вложения
XlsToCsv.7z
(478 байт) 6 скачиваний

rausNT
Опытный
Сообщения: 344
Зарегистрирован: Чт авг 24, 2017 9:23 am

Re: импорт из ods

Сообщение rausNT » Пн мар 19, 2018 6:37 pm

Снова понадобился програссбар. Можете подсказать?

jurist23rus
Эксперт
Сообщения: 2136
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: импорт из ods

Сообщение jurist23rus » Пн мар 19, 2018 6:50 pm

Destiny is a very convenient word for those who never take decisions.

rausNT
Опытный
Сообщения: 344
Зарегистрирован: Чт авг 24, 2017 9:23 am

Re: импорт из ods

Сообщение rausNT » Пн мар 19, 2018 7:23 pm

jurist23rus писал(а):Прогрессбар


конечно же я читал это, тем более это ответ на мой комментарий.
Я просил, если возможно поделится примером кода.

jurist23rus
Эксперт
Сообщения: 2136
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: импорт из ods

Сообщение jurist23rus » Пн мар 19, 2018 9:22 pm

Делал я как-то окошко замены прогресс-бара, но это всё же не предел моих мечтаний :) . Давайте сделаем настоящее окно прогресс-бара со всеми вытекающими, чтобы там и надпись была и полоса двигающаяся, может даже кнопочка "Прервать выполнение". Надо в этом направлении думать, и я думаю...
Destiny is a very convenient word for those who never take decisions.

cordek
Интересующийся
Сообщения: 182
Зарегистрирован: Вс май 14, 2017 2:53 pm

Re: импорт из ods

Сообщение cordek » Вт мар 20, 2018 12:04 am

Я сейчас тоже занялся импортом платежек, и в некоторых платежках в поле "Назначение платежа" есть перенос строки. Соответственно после переноса текст теряется и не импортируется. Как его победить?
прикладываю файл с импортируемой таблицей.
Вложения
Оплаты.zip
(374 байт) 5 скачиваний

Zenitchik
Интересующийся
Сообщения: 59
Зарегистрирован: Чт мар 08, 2018 1:07 am

Re: импорт из ods

Сообщение Zenitchik » Вт мар 20, 2018 12:50 am

А я плюнул на это дело и стал тупо в статус-бар проценты выводить.


Вернуться в «Общие вопросы.»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость