1 (edited by wertyby 2016-04-18 19:30:54)

Topic: Создание нескольких записей

Дмитрий, либо еще знатоки насколько реальна реализация одновременного ввода в БД нескольких записей, просто иногда нужной поместить в базу 40-100 записей с однотипной информацией, с разницей лишь в номере вещи, причем номера идут подряд хотя бывают разрывы в 1-4 вещи. Можно ли как-то реализовать например такой алгоритм заполняем все необходимые поля, а в поле с номером ставим порядковые номера например 323-373 и в БД записывается 50 строк, с данными номерами но одинаковыми остальными полями?

Re: Создание нескольких записей

Приветствую,


procedure Form1_Button5_OnClick (Sender: string; var Cancel: boolean);
var
    i: integer;
    iFrom, iTo: integer;
begin
    iFrom := Trunc(Form1.edFrom.Value);
    iTo := Trunc(Form1.edTo.Value);

    for i := iFrom to iTo do
    begin
        SQLExecute('INSERT INTO employees (lastname, firstname, num) VALUES('+
        Form1.Edit1.sqlValue+','+
        Form1.Edit2.sqlValue+','+
        IntToStr(i)+
        ')');
    end;
end;



Также можете скачать проект с примером

Post's attachments

Attachment icon Insert records.zip 7.59 kb, 488 downloads since 2016-04-20 

Dmitry.

Re: Создание нескольких записей

Ок. Спасибо пойду изучать и пробовать.

Re: Создание нескольких записей

Может Дмитрий либо еще кто нибудь прокомментирует строки:
iFrom:=Trunc(Form1.edFrom.Value);
и Form1.Edit1.sqlValue

Re: Создание нескольких записей

wertyby wrote:

Может Дмитрий либо еще кто нибудь прокомментирует строки:
iFrom:=Trunc(Form1.edFrom.Value);
и Form1.Edit1.sqlValue


// свойство компнента Value возвращает число с плавающей точкой, но нам для цикла необходим целочисленный тип, функция trunc обрезает у числа значение после запятой, тем самым преобразуя его в целый тип
iFrom:=Trunc(Form1.edFrom.Value);

// свойство компонента sqlValue содержит текстовое значение компонента, пригодное для использования в SQL запросах, т.к. текст в SQL запросах должен быть обрамлен кавычками и некоторые символы необходимо экранировать, что уже сделано автоматически в данном свойстве.
Form1.Edit1.sqlValue
Dmitry.

Re: Создание нескольких записей

Спасибо Дмитрий, а я все думал для чего тут trunc. Вопрос в догонку дату и чекбокс через sqlvalue прописать напрямую никак не получится? Только через доп скрипты? Как бы вопрос через доп скрипты яирешил, но может тоже можно как то напрямую уменьшив размер кода?

Re: Создание нескольких записей

wertyby wrote:

Спасибо Дмитрий, а я все думал для чего тут trunc. Вопрос в догонку дату и чекбокс через sqlvalue прописать напрямую никак не получится? Только через доп скрипты? Как бы вопрос через доп скрипты яирешил, но может тоже можно как то напрямую уменьшив размер кода?

Не совсем понимаю, что значит напрямую?

Dmitry.

Re: Создание нескольких записей

В данный момент поле с датой и чекбоксом в Ваш скрипт я добавил так через переменные:

if NEW_OM.OM_DATA.Checked then //если дата выбрана то:                                         //определяем ативировано ли поле даты выдачи материала
    sDataVidachi  := '"' + FormatDateTime('yyyy-MM-DD 00:00:00.000', NEW_OM.OM_DATA.Date) + '"' //присваиваем переменной значение поля даты выдачи в формате (год.месяц.дата)
  else sDataVidachi := 'NULL'; //если не выбрана то ничего                                       //если меню выбора не активировано то =0 (пропуск)

и

if NEW_OM.OM_Navsegda.Checked then sYesNo :='1' else sYesNo := '0';                         // переопрелеляем значение чекбокса в тип string
        sNavsegda := sYesNo;  

Представленный Вами выше код совсем компактен, и эти два решения занимают столько же места сколько и он, поэтому и возник вопрос может как можно упростить.
(Учитывая приведенный Вами пример, наверное потихоньку переделаю еще много кода т.к. у меня довольно большие объемы реализованы через переменные, и код можно сильно ужать в объеме )

Re: Создание нескольких записей

компоненты DateTimePicker и CheckBox также имеют свойство sqlValue (для DateTimePicker это sqlDateTime), которые удобно вставлять непосредственно в SQL запрос, добавил в код данные с компонентов DateTimePicker и CheckBox

procedure Form1_Button5_OnClick (Sender: string; var Cancel: boolean);
var
    i: integer;
    iFrom, iTo: integer;
begin
    iFrom := Trunc(Form1.edFrom.Value);
    iTo := Trunc(Form1.edTo.Value);

    for i := iFrom to iTo do
    begin
        SQLExecute('INSERT INTO employees (lastname, firstname, datetimefield, boolfield, num) VALUES('+
        Form1.Edit1.sqlValue+','+
        Form1.Edit2.sqlValue+','+
        Form1.DateTimePicker.sqlDateTime+','+
        Form1.CheckBox.sqlValue+','+
        IntToStr(i)+
        ')');
    end;
end;
Dmitry.

Re: Создание нескольких записей

Как реализовать данный код от номера последней записи в таблице БД (взять значение от id записи) до значения в текстовом поле?

Номер - id_Inventar     - последняя запись в таблице

В форме присутствует текстовое поле (вводится числовое значение N), при нажатии кнопки должно создаться N записей:

Номер+1 - id_Inventar
Номер+2 - id_Inventar
..........................................
Номер+N - id_Inventar

Re: Создание нескольких записей

vitstran wrote:

Как реализовать данный код от номера последней записи в таблице БД (взять значение от id записи) до значения в текстовом поле?

Номер - id_Inventar     - последняя запись в таблице

В форме присутствует текстовое поле (вводится числовое значение N), при нажатии кнопки должно создаться N записей:

Номер+1 - id_Inventar
Номер+2 - id_Inventar
..........................................
Номер+N - id_Inventar

пример

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
    maxID, i: integer;
begin
    maxID := SQLExecute('SELECT MAX(id_Inventar) FROM tablename');

    for i := 1 to Trunc(Form1.Edit1.Value) do
        SQLExecute( 'INSERT INTO tablename (id_Inventar, fieldname) VALUES('+IntToStr(maxID+i)+',"some value")' );
end;
Dmitry.

12 (edited by vitstran 2017-05-23 21:55:04)

Re: Создание нескольких записей

Несколько вопросов:
1. При открытие формы (FormPrihod) как отобразить записи в гриде без использования кнопки Поиск. Где-то видел пост с реализацией такой функции скриптом, но найти не могу.
2. Каким параметром в данном скрипте сохранять значение в таблице Sn из связанной таблицы Instrument (зависит от выбора в гриде)?
3. Как реализовать сохранение значений в таблицу Prihod значений с Text1, DateTimePicker1 и то что выбрано в гриде?

2 и 3 пункт должны срабатывать при нажатии кнопки Button1 и форма закрыться.

Заранее благодарен.

Post's attachments

Attachment icon Primer.zip 334.62 kb, 409 downloads since 2017-05-23 

Re: Создание нескольких записей

vitstran
1. К сожалению ваш проект видимо не доконца доделан, кнопки Инструмент и Приход не настроены. У вас грид уже настроен, чтобы он показал все записи из таблицы. Если данная форма будет открыта с помощью кнопки с действием Новая запись/Показать запись/Показать форму, то данные автоматически будут показаны в гриде. Если форма будет открыта с помощью скрипта, тогда грид нужно обновить также с помощью скрипта

FormPrihod.TableGrid1.dbUpdate;

2.

SQLExecute( 'INSERT INTO Sn (SnInstr, id_Instrument) VALUES('+IntToStr(maxID+i)+','+ FormPrihod.TableGrid1.sqlValue +')' ); 

3. Для этого есть стандартная кнопка с действием "Сохранить запись".

Dmitry.