Topic: импорт...
Доброго времени суток Дмитрий! версия 2.1
Взял скрипт из вашего примера по валютам и корректирую под свой нужды:
procedure Form1_Button2_OnClick (Sender: string; var Cancel: boolean);
var
OpenDialog: TOpenDialog; // объект для диалога выбора файла
sl: TStringList; // объект, представляющий из себя текстовый список
arrStr: array of string; // массив, в который будет возвращаться результат функции SplitString
i,c: integer; // числовые переменные для цикла
ValuteID: string;
sDate: string;
sval: string;
begin
OpenDialog := TOpenDialog.Create(Form1); // создаем диалог выбора файла
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 файле в качестве разделителя столбцов используется знак ;
// date - текстовое содержимое первого столбца содержится в arrStr[0]
if arrStr[0]<>'' then // если данные есть
sDate := '"'+ FormatDateTime('yyyy-MM-DD 00:00:00.000', StrToDate(arrStr[0])) + '"' // приводим дату к формату, который необходим для записи в БД
else sDate := 'NULL'; // иначе значение NULL
// id_valute - текстовое содердимое второго столбца содержится в arrStr[1]
ValuteID := SQLExecute ('SELECT id FROM valute WHERE valute LIKE "' + arrStr[1] +'"'); // ищем идентификатор названия валюты
if ValuteID = '' then ValuteID := 'NULL';
// value - текстовое содержимое третьего столбца содердижится в arrStr[2]
arrStr[2] := ReplaceStr(arrStr[2], ',', '.'); // т.к. в arrStr[2] число с плавающей запятой, на всякий случай заменяем запятую на точку, т.к. для записи в БД числа с плавающей запятой используется точка
if arrStr[2] = '' then arrStr[2] := 'NULL';
// проверяем, для избежания дубликатов, данная проверка не обязательна, и зависит от вашей ситуации
sval := SQLExecute('SELECT id FROM currency WHERE (date = ' + sDate + ') AND (id_valute = ' + ValuteID + ') AND (value = ' + arrStr[2] + ') ;');
if sval = '' then // если в переменной sval - пусто, значит SQL запрос ничего не вернул, и дубликата данных нет
SQLExecute ('INSERT INTO currency (date, id_valute, value) VALUES ('+ sDate +','+ ValuteID +','+arrStr[2] +');'); // с помощью SQL запрос вставляем данные в БД
Form1.Label1.Caption := IntToStr(i) + ' of ' + IntToStr(c); // выводим в компонент надписи, какое количество строк с данными обработано
Application.ProcessMessages; // необходимо, чтобы надпись в Label один обновилась
end;
sl.Free; // уничтожаем объект, после работы с ним
Form1.TableGrid1.dbUpdate; // заставляем TableGrid обновить данные
ShowMessage('Импорт завершен');
end;
OpenDialog.Free; // уничтожаем объект, после работы с ним
end;
Моя проблема заключается в том,что...
когда в CSV файле для импорта в колонки(их там три) попадает пустая клетка-ЭТО НОРМАЛЬНО!
но когда в CSV файле для импорта в колонки попадают в дату, название валют или кодировки
другой текст не имеющий отношения к дате, названию валют или кодировкам программа начинает ругаться...
Вопрос:
1. возможно ли разрешить импортировать даже если они попадаются ?
2. возможно ли разрешить импортировать, но тогда без них?
3. возможно ли разрешить импортировать, только те строчки,
в которых присутствует валюта в родительской таблице? если на 3. ДА подскажите куда, где, и что дописать?
Для меня это ВАЖНО! (любой вариант меня устроит... лишь бы с импортировать, P/S предпочтительно 3. пункт вопроса!!!)
если на 3. вопрос НЕТ...тогда 1.вариант или 2.вариант...
а в гриде я им устрою фильтр...указав какие строчки показывать с помощью ComboBox привязанному к названию валют...
С Уважением и Благодарностью Роман!!!