Дмитрий так как от программирования я далек, но потихоньку учусь, такой вопрос - сегодня после чтения мануалов смог подключить MySQL  сервер и у меня даже все начало подключаться и работать, но не смог @вкурить@,  как потом осуществляется перенос созданной базы данных на мощности сервера (кратко в нескольких словах, только суть если можно) и если серверная часть подключена и созданы таблицы можно ли переключаться между MySQL и SQLITE?

127

(28 replies, posted in Russian)

Дмитрий спасибо, ещё немножко поступил и получилось. Все заработало даже лучше, чем в лучших домах Парижа и Лондона. :-)

128

(28 replies, posted in Russian)

Так разделитель столбцов используется ',' а разделитель '!' используется при экспорте для разделения строк в многострочном поле, и при импорте все заливается дословно - как есть в текстовом файле. Понимаю что туплю но как данный символ убрать при экспорте? Скрипт тогда должен по идее усложниться.

129

(28 replies, posted in Russian)

Дмитрий,  в данном случае (исправленном Вами варианте), все вроде бы как и работает, но есть одно но - в случае выгрузки средствами базы в текстовый файл, используются междустрочные разделители вида "|", и при заливке в базу все так и заливается "т.е. привет|медвед|и|так|далее". Это нужно что то с файлом сделать?

130

(28 replies, posted in Russian)

Дмитрий спасибо, сверюсь. Вячеслав ещё помог, свой полёт прислал, путём разбора вроде тоже уже начал понимать где я тупил.

131

(28 replies, posted in Russian)

Доброго дня всем. Дмитрий -   никак у меня не получается добиться результата, даже попытался на основе скрипта выложенного в посте 12 создать формы, и если все равно не работает. Может глянете хотя бы программу которую собрал согласно поста  -12. Что не так. Экспорт через грид в текстовый файл, при попытке импорта выводится например сообщение "обработано 13 строк", а в таблицы ничего не пишет.

132

(28 replies, posted in Russian)

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

133

(28 replies, posted in Russian)

Дмитрий читал при переносы строк, в итоге пытался в csv менять разделитель "|" на "#13#10" - не помогло.  Если не очень затруднит гляньте csv файл и кусок скрипта аналогичный выложенному но где я пытался вставить кусок примера  Rebrovvv.  строки кода из примера которые пытался вставлять отмечены "//++++++++++++++++++++++" . Никаких ошибок при работе не выдает, выводит что импортировано например 9 строк, но ничего более не происходит.

https://drive.google.com/file/d/0B1hkxd … sp=sharing

И еще можно закоментировать эти строки, никак полность не пойму их смысл:

begin
              if (Length(sl[i])>0) and (sl[i][1]=';') then
              begin
                 sLine := sLine + sl[i];
                 arrStr:= SplitString(sLine, ';');

                  if arrStr[0][1]=' ' then
                  Delete(arrStr[0], 1, 2);

134

(28 replies, posted in Russian)

Давно Вас Дмитрий не терроризировал, а тут Кунар80 опередил, может Вы поможете, а может кто другой -  суть в следующем  имею рабочий скрипт по восстановлению базы из csv, но была проблема с переносом информации из поля memo, так как хранилась в многострочном  виде, и сохраняло только кусок текста до переноса строки.  Увидел эту тему, пытался применить пост выше на 1 от этого, так как  я понял проблема была однотипная но никак ее решить у меня не получается, может окажете легкую помощь? (восстанавливать пытался в тесте данные экспортированные в ексель, а затем сохраненные в csv)
текст листинга с комментариями рабочего кода но с описанной выше проблемой:

информация для восстановления из поля memo хранится в строке  if arrStr[4]<>'' then sPrimechanie := '"' + arrStr[4] + '"' else sPrimechanie := 'NULL';

procedure OTKAZNIE_MATERIALI_ImportVidMat_OnClick (Sender: string; var Cancel: boolean);  ///ИМПОРТ ДАННЫХ ИЗ CSV ФАЙЛА ДЛЯ РЕАЛИЗАЦИИ ПЕРЕНОСА И БЭКАПА
var
   OpenDialog: TOpenDialog; // объект для диалога выбора файла
   sl: TStringList; // объект, представляющий из себя текстовый список
   arrStr: array of string; // массив, в который будет возвращаться результат функции SplitString

   sID: string;          // ПЕРЕМЕННАЯ ID
   i,c: integer;         // числовые переменные для цикла
   sVidMat: string;      // переменная - вид материала
   sMaterial: string;    // переменная - номер материала
   sGod: string;         // переменная - год материала
   sDataVidachi: string; // переменная - дата выдачи материала
   sFio: string;         // переменная - фио получателя
   sSluzbi: string;      // переменная - служба получателя
   sPrimechanie: string; // переменная - примечение
   sNavsegda: string;    // переменная - если выдан навсегда, либо приобщен к чему либо
   srecord_count: string;
   sval: string;
   sYesNo: string;

begin
      OpenDialog := TOpenDialog.Create(OTKAZNIE_MATERIALI); // создаем диалог выбора файла
      //OpenDialog.InitialDir := 'd:\Archive 1.01\ImportCSV';  либо можно изменить на фыбор по умолчанию
      if OpenDialog.Execute then // запускаем диалог выбора файла, если результат выполенения True, значит файл был выбран

      begin
          sl := TStringList.Create; // создаем объект - текстовый список
          sl.LoadFromFile (OpenDialog.FileName); // загружаем в него csv файл, который пользователь выбрал через диалог выбора файла

          c := sl.Count - 1; // в переменной c будет содержаться количество строк в csv файле
          for i := 0 to c do  // запускаем цикл, чтобы пройтись по всем строчкам csv файла, который загрузили в объект sl (TStringList)

          begin
               arrStr := SplitString(sl[i], ';'); // sl[i] возвращает строку из csv файла, которую функция SplitString разделяет на столбцы. В данном csv файле в качестве разделителя столбцов используется знак ;
                //if arrStr[0]<>'' then srecord_count:= '"' + arrStr[0] + '"' else srecord_count:= 'NULL';
                //if arrStr[0]<>'' then sID          := '"' + arrStr[0] + '"' else sID          := 'NULL';
                if arrStr[0]<>'' then sMaterial    := '"' + arrStr[0] + '"' else sMaterial    := 'NULL';
                if arrStr[1]<>'' then sGod         := '"' + arrStr[1] + '"' else sGod         := 'NULL';

                if arrStr[2]<>'' then // если данные есть
                sDataVidachi := '"'+ FormatDateTime('yyyy-MM-DD 00:00:00.000', StrToDate(arrStr[2])) + '"' // приводим дату к формату, который необходим для записи в БД
                else sDataVidachi := 'NULL'; // иначе значение NULL

                if arrStr[3]<>'' then sFio         := '"' + arrStr[3] + '"' else sFio         := 'NULL';
                if arrStr[4]<>'' then sPrimechanie := '"' + arrStr[4] + '"' else sPrimechanie := 'NULL';

                sSluzbi := SQLExecute ('SELECT id FROM sluzba WHERE sluzbi LIKE "' + arrStr[5] +'"'); // и
                if sSluzbi = '' then sSluzbi := 'NULL';

                sVidMat := SQLExecute ('SELECT id FROM vidmateriala WHERE vidmat LIKE "' + arrStr[6] +'"'); // и
                if sVidMat = '' then sVidMat := 'NULL';

                if arrStr[7]<> '' then
           begin
                if arrStr[7] = 'Да' then sYesNo :='1';
                if arrStr[7] = 'Нет' then sYesNo :='0';
           end else sYesNo:='NULL';

                if arrStr[8]<>'' then srecord_count := '"' + arrStr[8] + '"' else srecord_count := 'NULL';

               SQLExecute ('INSERT INTO OTKAZNIE ( [MATERIAL], [GOD], [DATA_VIDACHI], [FIO],[PRIMECHANIE],id_SLUZBA, id_VIDMATERIALA, [NAVSEGDA], [record_count]) VALUES ('+
               sMaterial +','+ sGod +','+ sDataVidachi +','+ sFio +','+ sPrimechanie +','+ sSluzbi +','+ sVidMat +','+ sYesNo +','+ srecord_count + ');');


                //проверяем, для избежания дубликатов, данная проверка не обязательна, и зависит от вашей ситуации
              // sval := SQLExecute('SELECT id FROM otkaznie WHERE (Material = ' + arrStr[0] + ') AND (GOD = ' +  arrStr[1] + ');');

             // if sval = '' then // если в переменной sval - пусто, значит SQL запрос ничего не вернул, и дубликата данных нет
                // SQLExecute ('INSERT INTO otkaznie (Material, GOD ) VALUES ('+ arrStr[0] + '), ('+ arrStr[1] + ');'); // с помощью SQL запрос вставляем данные в БД


               OTKAZNIE_MATERIALI.ImportCSV.Caption := IntToStr(i) + ' of ' + IntToStr(c); // выводим в компонент надписи, какое количество строк с данными обработано
               Application.ProcessMessages; // необходимо, чтобы надпись в Label один обновилась
          end;

          sl.Free; // уничтожаем объект, после работы с ним
          OTKAZNIE_MATERIALI.REZULTAT.dbUpdate; // заставляем TableGrid обновить данные
     end;
     OpenDialog.Free; // уничтожаем объект, после работы с ним
end;

//procedure OTKAZNIE_MATERIALI_REZULTAT_OnColumnResize (Sender: string; ACol: Integer);
//begin

   // OTKAZNIE_MATERIALI_REZULTAT_OnChange ('');

//end;

Ок. Спасибо. Как всегда выручаете. Пойду разбираться.

Дмитрий здравствуйте , опять я. Никак не могу понять как в данном варианте можно организовать импорт если поле имеет значение "дата" либо является словарём т.е. id_name.  Ив предыдущих вариантах у меня все работает, но там сильно усложнённый код, с кучей ненужных переменных. Буду премного благодарен за образцы строк кода.

137

(26 replies, posted in Russian)

DriveSoft wrote:

atempbox
А что мешает вам отметить их звездочкой или цветом? )

Точно - вопрос читал, и не ожидал такого ответа. Все гениальное просто.  :-)

Спасибо Дмитрий, неожиданно. Работает - Супер. Пойду колдовать дальше. Я пытался сделать но с более простыми примерами, а они отказывались работать.

Не подчиняется мне данная возможность. Два вечера в никуда :- ((((. Уже и просит стесняюсь, но если будет минутка может кто сможет набросать  насчет присвоения значения в виде даты компоненту DateTimePicker. Дмитрия и отвлекать не сильно хочется.

Спасибо, вчера весь день почти шерстил интернет по данному вопросу, и даже в паре мест видел о преобразовании с помощью (EncodeDate), поэтому буду дальше рыть в этом направлении.

wertyby wrote:

Дмитрий а может знаете как можно реализовать при вводе даты в компоненте DateTimePicker (вручную), автоматический переход между позициями дд.мм.гггг (т.е. ввел значение даты курсор переместился на месяц а затем на год)?
(это млин привычка к таким базам и не хочется переключаться на мышь для выбора даты)

Поле Edit совсем ни как нельзя настроить для помещения в базу информации с датой?

Update - в принципе вопрос наверное не корректен. Нашел что TextBox у Вас совсем дату не принимает.

Тогда вопрос можно ли сделать так чтобы DateTimePicker отображал только информацию аналогичную TextBox с маской ввода. (отключить чекбокс и возможность выбора даты через компонент), т.е. чтобы она вводилась только вручную?

Дмитрий а может знаете как можно реализовать при вводе даты в компоненте DateTimePicker (вручную), автоматический переход между позициями дд.мм.гггг (т.е. ввел значение даты курсор переместился на месяц а затем на год)?
(это млин привычка к таким базам и не хочется переключаться на мышь для выбора даты)

Поле Edit совсем ни как нельзя настроить для помещения в базу информации с датой?

Спасибо за ответ. Так и предполагал. И если с большей частью кода мне визуально понятно, то больше интересует структура данной строки

 if arrStr[1] <> '' then arrStr[1] := ''''+ ReplaceStr(arrStr[1], '''', '''''') + ''''

слишком много для меня знаков  такого вида, ("") и просто не могу никак сообразить за что они в таком количестве отвечают.  :-(
А структура реально упростилась.

Дмитрий тогда такой вопрос - если в грид не выводится значение поля счетчик, и запись удаляется (именно через меню грид, удалить запись), то тогда получается строка в таблице базы данных (не гриде) все равно остается? т.к. значение поля не удалено, и отсчет продолжается, или у Вас данная функция реализована иным образом.
(вопрос связан с тем, что если строка остается, то база постоянно растет, даже и при удалении каких либо записей.)

Дмитрий а в чем отличие данного примера от других?
И не могли бы Вы прокомментировать данный участок, не  совсем понимаю что к чему:

begin
               arrStr := SplitString(sl[i], ';');

               // LastName
               if arrStr[0] <> '' then arrStr[0] := ''''+ ReplaceStr(arrStr[0], '''', '''''') + ''''
                   else arrStr[0] := 'NULL';

               // FirstName
               if arrStr[1] <> '' then arrStr[1] := ''''+ ReplaceStr(arrStr[1], '''', '''''') + ''''
                   else arrStr[1] := 'NULL';

               SQLExecute ('INSERT INTO base (lastname, firstname) VALUES ('+ arrStr[0] +','+ arrStr[1]+');');


               Form1.Label1.Caption := IntToStr(i+1) + ' of ' + IntToStr(c+1);
               Application.ProcessMessages;
          end;

Спасибо.

т.е. из базы никак? только программами типа SQLiteStudio если записей очень много и половину из них нужно сдвинуть вниз на 1 позицию освободив одно Id?

Опять я. Дмитрий а как реализовать функцию которая могла бы добавить новую строку в таблице в определенном месте? Сегодня заметил что пропустил одну запись которые идут строго по порядку и пришлось около 20 строк удалять и переписывать заново, но уже с добавлением пропущенной. Спасибо за ответ.

148

(26 replies, posted in Russian)

В развитие темы - еще меню вкладка наверное частично подойдет.

Дмитрий а более общий вопрос:
1. имеем таблицу с полем счетчик для учета общего количества помещенных записей, без учета удаленных строк.
2. написаны скрипты для экспорта из CSV файла, где данное поле включено в запись базы. Проверка работоспособности проверялась при помощи экспортируемых в exceл записей из грида. (т.е. позиция по счетчику внесена в файл CSV) (без данной колонки в последующем после экспорта невозможно отредактировать запись, т.к. = ОШИБКА)
3. сейчас приходит понимание, что это наверное не совсем верно, т.к. в случае экспорта например сторонних данных нужно в ручную будет в   CSV файле прописывать нумерацию согласно данных счетчика внесенных в базу.
4. Также прописаны скрипты ведения логов базы данных, и при удалении записи из грида в данный момент удаляется и информация из позиции счетчика, т.к. данная позиция вынесена в грид для возможности экспорта в Exel (а он забирает автоматически только те колонки что перечислены в гриде),  и соответственно значение по счетчику минусуется каждый раз на -1. 

Вопрос -  как логично перенастроить все данные, чтобы возможность экспорта в excel с колонкой "счетчика" осталась, и при этом убрать информацию о счетчике  из грида, чтобы данная ячейка  не удалялась при удалении записи и всегда считалась +1.

Немного сумбурно конечно, но по другому не придумал как описать :-)

Спасибо работает. И снова благодарю за наилучшую поддержку.