Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129

из ms sql в dbf- файл

26.07.2012, 11:13. Показов 3931. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Подскажите пожалуйста,как реализовать?
имеется dbf-файл(dbase4), он как шаблон, нужно сделать следующее:
Имеется база в ms sql, есть селект такого вида select a1,a2 from base where условие a1 in (select ... from ... where...), в общем вложенные запросы.
Тупой вопрос,но запутался как вставить этот результат в определенную таблицу dbf файла.
Использую компоненты:
dbgrid,ttable,adoconnection,adoquery итп
Как то в уже заполненный dbf вставлял определенное значение таким образом:
Pascal
1
2
3
4
5
6
7
8
9
10
    DBGrid1.DataSource.DataSet.First;
    while not DBGrid1.DataSource.DataSet.Eof do
    begin
      DBGrid1.DataSource.DataSet.Edit;
      DBGrid1.DataSource.DataSet.FieldByName('PLPOR').AsString :=Edit3.Text;
      DBGrid1.DataSource.DataSet.FieldByName('DATOP').AsString:=Edit2.Text;
      DBGrid1.Font.Color:=ClGreen;
      DBGrid1.DataSource.DataSet.Post;
      DBGrid1.DataSource.DataSet.Next;
    end


А теперь как мне сам селект вставить по строчно, т.е. если в селекте 10 строк , то все они по порядку вставились в dbf
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.07.2012, 11:13
Ответы с готовыми решениями:

SQL и dbf файл
Здравствуйте, помогите с проблемой. Мне нужно сделать программу, для вывода расписания на сенсорные экраны. Есть dbf.ка расписания учебных...

Нужно внешний DBF файл - добавить в SQL таблицу
Посоветуйте, как лучше Нужно внешний DBF файл - добавить в SQL таблицу. Причем, dbf - находится на компьютере пользователя, а SQL база...

Как "доказать" Delphi, что файл с расширением не DBF - все таки dbf
Добрый день, коллеги-сокнопочники! Бьюсь-ломлюсь в открытую дверь (как мне кажется). Есть файл с именем *.0ew или *.1t6, но на самом...

18
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,600
28.07.2012, 03:30
Цитата Сообщение от denis_stell Посмотреть сообщение
Добрый день!
Подскажите пожалуйста,как реализовать?
имеется dbf-файл(dbase4), он как шаблон, нужно сделать следующее:
Имеется база в ms sql, есть селект такого вида select a1,a2 from base where условие a1 in (select ... from ... where...), в общем вложенные запросы.
Тупой вопрос,но запутался как вставить этот результат в определенную таблицу dbf файла.
Использую компоненты:
dbgrid,ttable,adoconnection,adoquery итп
Как то в уже заполненный dbf вставлял определенное значение таким образом:
Pascal
1
2
3
4
5
6
7
8
9
10
    DBGrid1.DataSource.DataSet.First;
    while not DBGrid1.DataSource.DataSet.Eof do
    begin
      DBGrid1.DataSource.DataSet.Edit;
      DBGrid1.DataSource.DataSet.FieldByName('PLPOR').AsString :=Edit3.Text;
      DBGrid1.DataSource.DataSet.FieldByName('DATOP').AsString:=Edit2.Text;
      DBGrid1.Font.Color:=ClGreen;
      DBGrid1.DataSource.DataSet.Post;
      DBGrid1.DataSource.DataSet.Next;
    end


А теперь как мне сам селект вставить по строчно, т.е. если в селекте 10 строк , то все они по порядку вставились в dbf
Вы говорите непонятно или я не понял ваши вопрос ? Скажите пожалуйста какая у вас таблица и какой запрос вы делайте что вы хотите получит в итоге ?
0
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
28.07.2012, 10:21
Цитата Сообщение от denis_stell Посмотреть сообщение
Подскажите пожалуйста,как реализовать?

Имеется база в ms sql, есть селект такого вида select a1,a2 from base where условие a1 in (select ... from ... where...),

..как вставить этот результат в определенную таблицу dbf файла.

Использую компоненты: dbgrid,Mytable,adoconnection,adoquer...
Примерно так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
AdoQuery.Open;
 
Mytable.Open; {Active:=True}
 
AdoQuery.First;
while not adoquery.EOF do
begin
  Mytable.Append;
  Mytable.FieldByName('MyFieldName1').Value :=  AdoQuery.FieldByName('QueryFieldName1').Value;
  {...}
  Mytable.Post;
  AdoQuery.Next;
end;
1
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
28.07.2012, 17:14  [ТС]
Цитата Сообщение от albor Посмотреть сообщение
Примерно так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
AdoQuery.Open;
 
Mytable.Open; {Active:=True}
 
AdoQuery.First;
while not adoquery.EOF do
begin
  Mytable.Append;
  Mytable.FieldByName('MyFieldName1').Value :=  AdoQuery.FieldByName('QueryFieldName1').Value;
  {...}
  Mytable.Post;
  AdoQuery.Next;
end;
ага,так и делаю, но возникла проблема в том, что у меня в dbf файле структура состоит из 54 колонок,
мне нужно получается 54 AdoQuery использовать,на что мне прога после 4 или 5 не помню точно говорит, что слишком много их....пришла идея,а не использовать мне функцию,в которой будет один AdoQuery, но по параметрам выбирать то значение из базы которое мне нужно.Пишу так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function get_select:string;
var res:string;
i:integer;
begin
  i:=strtoint(edit3.Text);
   with ADOQuery1 do
   try
 
     ADOQuery1.SQL.Text:='select [FIELD_MONEY] from [PS_PAYMENT_ADDFL] where id_field=:id_field and id_object in (select [id_payment] from [PS_PAYMENT] where date_trn=''2012-06-22'' and id_object=id_payment)';
     ADOQuery1.Parameters.ParamByName('id_field').Value:=i;
     ADOQuery1.Open;
   
    
      res:=ADOQuery1.Fields[0].Value;
      ADOQuery1.Next;
      
   finally
 
     result:=res;
 
    ADOQuery1.Close;
   end;
 
end;
вызываю так
в цикле с другими так
Delphi
1
DBGrid1.DataSource.DataSet.FieldByName('KLI').AsString :=GET_SELECT;
Получается что в дбф записи в столбец KLI заносятся одинаковые, т.е. если смотреть селект в ms sql он отрабатывает и возвращает в конкретном случае 9 записей(не одинаковых), но после отработки проги проставляются только первое значение из базы по всем 9 строкам,как исправить не пойму.Подскажите пожалуйста!!!
0
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
28.07.2012, 19:33
Цитата Сообщение от denis_stell Посмотреть сообщение
ага,так и делаю, но возникла проблема в том, что у меня в dbf файле структура состоит из 54 колонок,
мне нужно получается 54 AdoQuery использовать,на что мне прога после 4 или 5 не помню точно говорит, что слишком много их..
Да хоть 254 колонки! Один AdoQuery вполне достаточно. Картинку покажите, что ей там не нравится.

Повторяю пример, который должен работать безусловно:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AdoQuery.Open;
 
Mytable.Open; {Active:=True}
 
AdoQuery.First;
while not adoquery.EOF do
begin
  Mytable.Append;
  Mytable.FieldByName('MyFieldName1').Value :=  AdoQuery.FieldByName('QueryFieldName1').Value;
  Mytable.FieldByName('MyFieldName2').Value :=  AdoQuery.FieldByName('QueryFieldName2').Value;
  Mytable.FieldByName('MyFieldName3').Value :=  AdoQuery.FieldByName('QueryFieldName3').Value;
  {...}
  Mytable.FieldByName('MyFieldName99').Value :=  AdoQuery.FieldByName('QueryFieldName99').Value;
  Mytable.Post;
  AdoQuery.Next;
end;
0
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
28.07.2012, 22:57  [ТС]
Цитата Сообщение от albor Посмотреть сообщение
Да хоть 254 колонки! Один AdoQuery вполне достаточно. Картинку покажите, что ей там не нравится.

Повторяю пример, который должен работать безусловно:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AdoQuery.Open;
 
Mytable.Open; {Active:=True}
 
AdoQuery.First;
while not adoquery.EOF do
begin
  Mytable.Append;
  Mytable.FieldByName('MyFieldName1').Value :=  AdoQuery.FieldByName('QueryFieldName1').Value;
  Mytable.FieldByName('MyFieldName2').Value :=  AdoQuery.FieldByName('QueryFieldName2').Value;
  Mytable.FieldByName('MyFieldName3').Value :=  AdoQuery.FieldByName('QueryFieldName3').Value;
  {...}
  Mytable.FieldByName('MyFieldName99').Value :=  AdoQuery.FieldByName('QueryFieldName99').Value;
  Mytable.Post;
  AdoQuery.Next;
end;

Может что не понимаю,посмотрите пожалуйста:
Делаю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
var
i:integer;
begin
  i:=strtoint(edit3.Text);
    with ADOQuery1 do
    with adoquery2 do
    try
      ADOQuery1.SQL.Text:='select * from [PS_PAYMENT_ADDFL] where id_field=:id_field and id_object in (select [id_payment] from [PS_PAYMENT] where DATE_TRN=''2012-06-22'' and id_object=id_payment)';
      ADOQuery1.Parameters.ParamByName('id_field').Value:=I;
      Adoquery2.SQL.Text:='select * from [PS_PAYMENT_ADDFL] where id_field=55 and id_object in (select [id_payment] from [PS_PAYMENT] where DATE_TRN=''2012-06-22'' and id_object=id_payment )';
      Adoquery3.SQL.Text:='select * from [PS_PAYMENT_ADDFL] where id_field=54 and id_object in (select [id_payment] from [PS_PAYMENT] where DATE_TRN=''2012-06-22'' and id_object=id_payment )';
      Adoquery4.SQL.Text:='select * from [PS_PAYMENT_ADDFL] where id_field=92 and id_object in (select [id_payment] from [PS_PAYMENT] where DATE_TRN=''2012-06-22'' and id_object=id_payment )';
      ADOQuery1.Open;
      ADOQuery2.Open;
      ADOQuery3.Open;
      ADOQuery4.Open;
      DBGrid1.DataSource.DataSet.Open;
      DBGrid1.DataSource.DataSet.First;
      while not ADOQuery1.Eof do
      while not ADOQuery2.Eof do
      while not ADOQuery3.Eof do
      while not ADOQuery4.Eof do
      begin
        table1.Append;
        DBGrid1.DataSource.DataSet.Edit;
        DBGrid1.DataSource.DataSet.FieldByName('KLI').AsString :=ADOQuery1.FieldByName('FIELD_MONEY').AsString;
        DBGrid1.DataSource.DataSet.FieldByName('FDOLG').AsString :=ADOQuery2.FieldByName('FIELD_MONEY').AsString;
        DBGrid1.DataSource.DataSet.FieldByName('FHEND').AsString :=ADOQuery3.FieldByName('FIELD_MONEY').AsString;
        DBGrid1.DataSource.DataSet.FieldByName('LS').AsString :=ADOQuery4.FieldByName('FIELD_STRING').AsString;
 
        Table1.Post;
        DBGrid1.DataSource.DataSet.Next;
        ADOQuery1.Next;
        ADOQuery2.Next;
        ADOQuery3.Next;
        ADOQuery4.Next;
      end;
      DBGrid1.DataSource.DataSet.Close;
    finally
      showmessage('Записи занесены');
    end;
    end;
end;
Т.е. под каждым селектом свой ADOQuery,если 5 и больше то ошибка,один ADOQuery как я понимаю я не могу использовать в своем случае,так как:
селект у меня вложенный,т.е. отбираю значения которые мне нужны по id_field,из которых мне необходимо раскидать по 54 столбцам свое...можете наблюдать по sql,который я привел вверху

Добавлено через 4 минуты
т.е. id_fileld=столбцу в dbf файле
0
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
28.07.2012, 23:20
В принципе сложновато, но имеете право.

Мне только непонятно одно место:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      while not ADOQuery1.Eof do
      while not ADOQuery2.Eof do
      while not ADOQuery3.Eof do
      while not ADOQuery4.Eof do
      begin
        table1.Append;
        DBGrid1.DataSource.DataSet.Edit;
        DBGrid1.DataSource.DataSet.FieldByName('KLI').AsString :=ADOQuery1.FieldByName('FIELD_MONEY').AsString;
        DBGrid1.DataSource.DataSet.FieldByName('FDOLG').AsString :=ADOQuery2.FieldByName('FIELD_MONEY').AsString;
        DBGrid1.DataSource.DataSet.FieldByName('FHEND').AsString :=ADOQuery3.FieldByName('FIELD_MONEY').AsString;
        DBGrid1.DataSource.DataSet.FieldByName('LS').AsString :=ADOQuery4.FieldByName('FIELD_STRING').AsString;
 
        Table1.Post;
        DBGrid1.DataSource.DataSet.Next;
        ADOQuery1.Next;
        ADOQuery2.Next;
        ADOQuery3.Next;
        ADOQuery4.Next;
      end;
Если данные переносятся в Table1 (с ней Append & Post), то зачем DBGrid1.DataSource.DataSet.Edit ?
Или таблица подключена к DBGrid1. Тогда тем более нельзя еще и Edit делать.
И зачем DBGrid1.DataSource.DataSet.Next ? Он вроде в While..EOF не участвует.
0
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
28.07.2012, 23:46  [ТС]
albor,
открываю таблицу через dbgrid, в котором datasourse в датасете связан с ttable.
поэтому по привычке так делаю,скорей всего можно и убрать это.хотя как мы будем переходить к другой строке в датасете?в таблице?Если честно меня больше всего интересует вопрос,как всё таки вставить данные?через один запрос не получиться правильно же?конечно хотелось бы через функцию делать,чтобы передать необходимы параметры, а в самой в функции был один запрос.
Сможете помочь разобраться?
0
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
29.07.2012, 00:27
Цитата Сообщение от denis_stell Посмотреть сообщение
albor,
...
Отвечаю по порядку:

открываю таблицу через dbgrid, в котором datasourse в датасете связан с ttable.
поэтому по привычке так делаю,скорей всего можно и убрать это.

Не можно, а нужно. Иначе черт знает что получается..(с)
хотя как мы будем переходить к другой строке в датасете?в таблице?
К какой другой. Append это и есть другая строка.
Если честно меня больше всего интересует вопрос,как всё таки вставить данные?
через один запрос не получиться правильно же?
конечно хотелось бы через функцию делать,чтобы передать необходимы параметры,
а в самой в функции был один запрос.

Почему нет, все можно сделать.
Если я правильно понял, Вам нужно собрать данные из четырех строк таблицы PS_PAYMENT_ADDFL и занести (добавить) их в одну строку Вашей Table.
Т.е. в минимальном случае в исходной таблице существуют (обязательно) четыре строки с значениями id_field=55,54,92 и еще какое-то, которое Вы вводите сами.
А прочесть нужно FIELD_MONEY или FIELD_STRING.

Давайте их объединим в одном запросе:

SQL
1
2
3
4
5
6
7
8
SELECT a.FIELD_MONEY AS AFIELD, b.FIELD_MONEY AS BFIELD, c.FIELD_MONEY AS CFIELD, d.FIELD_STRING AS DFIELD 
FROM PS_PAYMENT p
(LEFT OUTER JOIN PS_PAYMENT_ADDFL a ON a.id_object=p.id_payment
(LEFT OUTER JOIN PS_PAYMENT_ADDFL b ON b.id_object=p.id_payment
(LEFT OUTER JOIN PS_PAYMENT_ADDFL c ON c.id_object=p.id_payment
(LEFT OUTER JOIN PS_PAYMENT_ADDFL d ON d.id_object=p.id_payment))))
WHERE a.id_field=:param AND b.id_field=55 AND c.id_field=54 AND d.id_field=92
AND p.DATE_TRN=''2012-06-22'';
Вроде так, хотя надо проверить. Пробуйте. Должно получиться.
1
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
29.07.2012, 09:27  [ТС]
Цитата Сообщение от albor Посмотреть сообщение
Отвечаю по порядку:

открываю таблицу через dbgrid, в котором datasourse в датасете связан с ttable.
поэтому по привычке так делаю,скорей всего можно и убрать это.

Не можно, а нужно. Иначе черт знает что получается..(с)
хотя как мы будем переходить к другой строке в датасете?в таблице?
К какой другой. Append это и есть другая строка.
Если честно меня больше всего интересует вопрос,как всё таки вставить данные?
через один запрос не получиться правильно же?
конечно хотелось бы через функцию делать,чтобы передать необходимы параметры,
а в самой в функции был один запрос.

Почему нет, все можно сделать.
Если я правильно понял, Вам нужно собрать данные из четырех строк таблицы PS_PAYMENT_ADDFL и занести (добавить) их в одну строку Вашей Table.
Т.е. в минимальном случае в исходной таблице существуют (обязательно) четыре строки с значениями id_field=55,54,92 и еще какое-то, которое Вы вводите сами.
А прочесть нужно FIELD_MONEY или FIELD_STRING.

Давайте их объединим в одном запросе:

SQL
1
2
3
4
5
6
7
8
SELECT a.FIELD_MONEY AS AFIELD, b.FIELD_MONEY AS BFIELD, c.FIELD_MONEY AS CFIELD, d.FIELD_STRING AS DFIELD 
FROM PS_PAYMENT p
(LEFT OUTER JOIN PS_PAYMENT_ADDFL a ON a.id_object=p.id_payment
(LEFT OUTER JOIN PS_PAYMENT_ADDFL b ON b.id_object=p.id_payment
(LEFT OUTER JOIN PS_PAYMENT_ADDFL c ON c.id_object=p.id_payment
(LEFT OUTER JOIN PS_PAYMENT_ADDFL d ON d.id_object=p.id_payment))))
WHERE a.id_field=:param AND b.id_field=55 AND c.id_field=54 AND d.id_field=92
AND p.DATE_TRN=''2012-06-22'';
Вроде так, хотя надо проверить. Пробуйте. Должно получиться.
Не совсем id_fileld это признак по которому я отбираю значения чтобы вставить в таблицу,т.е. у меня 54 колонки каждая колонка это отдельный id_fileld в базе со своим значением FIELD_MONEY или FIELD_STRING

Добавлено через 7 минут
всё таки думал на счет функции(get_select), она отрабатывает но получается для всех проходов только один раз.
Кажется что так по проще будет,одна функция, только будут значения отбираться по 54 параметрам

Добавлено через 6 минут
чтобы понятней Вам было:
PS_PAYMENT_ADDFL состоит из
id_object|id_field|field_date|field_mone y|field_string
PS_PAYMENT и PS_PAYMENT_ADDFL связаны по id_object
PS_PAYMENT - это таблица с платежами принятые организацией с доп.полями таблицы PS_PAYMENT_ADDFL.

Добавлено через 5 минут
т.е. PS_PAYMENT_ADDFL это таблица где хранятся доп.поля платежей
но разбор данный что есть что обозачается в id_field
т.е. если строка с id_field=46- это общая сумма платежа
если id_field=44 - дата платежа
если id_field = 55 - код организации
итд
0
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
29.07.2012, 09:35
Цитата Сообщение от denis_stell Посмотреть сообщение
Не совсем, id_fileld это признак по которому я отбираю значения чтобы вставить в таблицу,т.е. у меня 54 колонки каждая колонка это отдельный id_fileld в базе со своим значением FIELD_MONEY или FIELD_STRING

Добавлено через 7 минут
всё таки думал на счет функции(get_select), она отрабатывает но получается для всех проходов только один раз.
Кажется что так по проще будет,одна функция, только будут значения отбираться по 54 параметрам

Добавлено через 6 минут
чтобы понятней Вам было:
PS_PAYMENT_ADDFL состоит из
id_object|id_field|field_date|field_mone y|field_string
PS_PAYMENT и PS_PAYMENT_ADDFL связаны по id_object
PS_PAYMENT - это таблица с платежами принятые организацией с доп.полями таблицы PS_PAYMENT_ADDFL.
54 колонки это круто. Кто ж Вас так нагрузил..

Итак, для каждой строки PS_PAYMENT (Мастер) существует 54 строки в таблице PS_PAYMENT_ADDFL (детали).
связь по PS_PAYMENT.id_object=PS_PAYMENT_ADDFL.id _object
похоже, что этот id_object надо и в выходную таблицу писать, да?
а там (детали) точно всегда 54 строки, не может быть что их окажется иногда 45 .. ?
0
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
29.07.2012, 09:55  [ТС]
кто ж , начальство
да,все вроде верно
id_field всегда 54(точнее у нас их больше ста,но нужно 54)

Добавлено через 3 минуты
albor,
id_field не по порядку от 1..54, а в разброс, и 92 и 4 и 55, в общем 54 разных из общего числа
0
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
29.07.2012, 10:54
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от denis_stell Посмотреть сообщение
кто ж , начальство
да,все вроде верно
id_field всегда 54(точнее у нас их больше ста,но нужно 54)

Добавлено через 3 минуты
albor,
id_field не по порядку от 1..54, а в разброс, и 92 и 4 и 55, в общем 54 разных из общего числа
Ну, тогда я бы предложил Вам простое крестьянское решение:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const
  SourceFieldID: array[0..53] of integer =(51,54,55,92....); //и так все 54 требуемых кода
var
  i: integer;
  V: Variant;
begin
AdoQuery.SQL.Text := 
  'SELECT P.ID_OBJECT, A.ID_FIELD, a.FIELD_MONEY, a.FIELD_STRING '+   
  'FROM PS_PAYMENT P '+
  '(LEFT OUTER JOIN PS_PAYMENT_ADDFL A ON A.ID_OBJECT=P.ID_OBJECT) '+
  'WHERE p.DATE_TRN=:DATE AND p.ID_OBJECT=:IDOBJECT'; 
 
AdoQuery.Parameters.ParamByName('DATE').Value := StrToDate('22.06.2012');
AdoQuery.Parameters.ParamByName('IDOBJECT').Value := ...;//ввести известный нам код 
 
AdoQuery.Open; //получаем сразу все 99 строк ID_FIELD для выбранной даты
Table.Open;       //Открываем таблицу DBF
Table.Append;    //и переводим в режим добавления записи
 
for i:=0 to 53 do                                                      //для каждого из 54 требуемых
if AdoQuery.Locate('ID_FIELD', SourceFieldID[i], []) then //находим в запросе запись с нужным кодом
begin
   V:=AdoQuery.FieldByName('FIELD_MONEY').Value;       //или STRING 
   Table.FieldByName(DestFieldNames[i]).Value := V; //добавить массив имен полей в таблице
end
 
Table.Post;                                                       //сохраняем в ДБФ-таблице
Эта процедура создаст одну строку (54 поля) в ДБФ-таблице, соответствующую коду строки в PS_PAYMENT. Не забудьте там возможно еще надо добавить ид или дату..
А дальше, наверно, и сами сделаете.
1
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
29.07.2012, 17:43  [ТС]
знаете не могу понять,а как будут распределяться значения в дбф файле?имею в виду, по кодам.
т.е. в массив заносятся значения, потом локайтем ищем ид по SourceFieldID из массива и добавляем но как добавиться в таблицу?последовально как задали в массиве?или как? не надо сапоставлять поле в дбф файле и код из таблицы?
0
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
29.07.2012, 18:14
Цитата Сообщение от denis_stell Посмотреть сообщение
знаете не могу понять,а как будут распределяться значения в дбф файле?имею в виду, по кодам.
т.е. в массив заносятся значения, потом локайтем ищем ид по SourceFieldID из массива и добавляем но как добавиться в таблицу?последовально как задали в массиве?или как? не надо сапоставлять поле в дбф файле и код из таблицы?
Обратите внимание на мой комментарий - "добавить массив имен полей в таблице"
Delphi
1
Table.FieldByName(DestFieldNames[i]).Value := V; //добавить массив имен полей в таблице
Вам нужно создать еще массив имен полей для приема данных.
Delphi
1
DestFieldNames: array[0..53] of string16 = ('Field1','Field21'.........)
0
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
30.07.2012, 17:52  [ТС]
а ну да,логично не подумал.
Прошу прощения,завтра буду пробовать на работе.

Добавлено через 17 часов 15 минут
albor,
наверно надоел я Вам,если можно то ещё один вопрос, как сделать так чтобы?
когда мы берем значения по "FIELD_MONEY" V:=AdoQuery.FieldByName('FIELD_MONEY').V alue;в саму sql попадают значения в поля FIELD_MONEY,FIELD_STRING,FIELD_DATE,соот ветственно если одно поле заполнено, то остальные пустые.
как тогда мне сделать чтобы для определенных кодов массива DestFieldNames бралось из ado либо FIELD_MONE либо остальные?

Добавлено через 25 минут
если оставить как есть,то ошибка звучит так "Ошибка неизвестного типа"

Добавлено через 12 минут
по поводу ошибки разобрался, цикл был на 1 больше

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

Добавлено через 5 часов 0 минут
albor,
вы не читайте пожалуйста что я написал утром, совсем башка не варила.
Можете только вот что подсказать.На данный момент вставляется одна запись в дбф файл, селект отрабатывает, результат 9 строк которые надо вставить, в дфб вставляется только первая
0
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
31.07.2012, 09:23
Цитата Сообщение от denis_stell Посмотреть сообщение
..На данный момент вставляется одна запись в дбф файл, селект отрабатывает, результат 9 строк которые надо вставить, в дфб вставляется только первая
Что Вы подставили во вторую строку моего пример("ввести известный нам код")? Тогда скажу что делать дальше. А может и сами догадаетесь..
Delphi
1
2
3
4
...
AdoQuery.Parameters.ParamByName('DATE').Value := StrToDate('22.06.2012');
AdoQuery.Parameters.ParamByName('IDOBJECT').Value := ...;//ввести известный нам код 
...
0
 Аватар для denis_stell
1 / 1 / 0
Регистрация: 07.02.2010
Сообщений: 129
31.07.2012, 17:29  [ТС]
это поле закоментировал, мне нужно по всем id_object(по всем платежам которые принял оператор)

Добавлено через 2 часа 38 минут
albor,
и ещё если можно такой вопрос, если все таки в базе по id_fileld ,будет null, как мне те поля которых нет, вставить в базу со значением 0 ???

Добавлено через 36 секунд
* вставить в дбф - файл
0
 Аватар для albor
504 / 106 / 16
Регистрация: 01.12.2011
Сообщений: 399
31.07.2012, 18:30
Цитата Сообщение от denis_stell Посмотреть сообщение
это поле закоментировал, мне нужно по всем id_object(по всем платежам которые принял оператор)
Это ошибка. Ведь Вам нужно перебрать все записи относящиеся к одному конкретному объекту. А уже потом переходить к следующему.
Цитата Сообщение от denis_stell Посмотреть сообщение
и ..если все таки в базе по id_fileld ,будет null, как мне те поля которых нет, вставить в базу со значением 0 ???
А Вы постарайтесь чтобы не было. Это уж совсем несерьезно.

Я бы на вашем месте сделал так (добавить AdoQuery2 как Мастер):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
procedure AddDBFRecord(Id: integer);
const
  SourceFieldCount=54;
  SourceFieldID: array[0..SourceFieldCount-1] of integer =(51,54,55,92....); //и так все 54 требуемых кода
var
  i: integer;
  V: Variant;
begin
  AdoQuery.SQL.Text := 
  'SELECT A.ID_FIELD, a.FIELD_MONEY, a.FIELD_STRING '+   
  'FROM PS_PAYMENT_ADDFL A '+
  'WHERE a.ID_OBJECT=:IDOBJECT'; 
 
  AdoQuery.Parameters.ParamByName('IDOBJECT').Value := Id;
 
  AdoQuery.Open; //получаем сразу все 99 строк ID_FIELD для выбранной даты
  Table.Open;       //Открываем таблицу DBF
  Table.Append;    //и переводим в режим добавления записи
 
  for i:=0 to SourceFieldCount-1 do                                                      //для каждого из 54 требуемых
  if AdoQuery.Locate('ID_FIELD', SourceFieldID[i], []) then //находим в запросе запись с нужным кодом
  begin
     V:=AdoQuery.FieldByName('FIELD_MONEY').Value;       //или STRING 
     Table.FieldByName(DestFieldNames[i]).Value := V; //добавить массив имен полей в таблице
  end
  Table.Post;                                                  
end; {procedure AddDBFRecord}
 
begin
  AdoQuery2.SQL.Text := 
  'SELECT P.ID_OBJECT '+
  'FROM PS_PAYMENT P '+
  'WHERE p.DATE_TRN=:DATE'; 
 
  //не забыть ввести в параметр дату. 
 
  AdoQuery2.Open;
  while not AdoQuery2.EOF do
  begin
     AddDBFRecord(AdoQuery2.FieldByName('ID_OBJECT').AsInteger);
     AdoQuery2.Next;
  end;
end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.07.2012, 18:30
Помогаю со студенческими работами здесь

Прочитать содержимое dbf (файл SER.Dbf). И вывести содержимое нескольких полей
Всем привет) Можете пожалуйста помочь, может кто хорошо разбирается в работе с dbf файлами... Задача такая: прочитать содержимое dbf...

SQL в DBF !!! Помогите!!!
Здрасвуйте! Есть дамп с linux sql сервака 3.23.41, снял используя phpmyadmin. Как мне его перевести в DBF который понимает database desktop...

пишет что .dbf файл не найден, хотя .accdb файл есть
куда мог подеваться файл с .dbf ? и как его вернуть, файл с расширением .accdb на месте.

Ms Sql и Dbf в локальной сети
Диспозиция. Есть сервер 2003 SBS + ms sql 2008r2 x32, там всё работает, то что нужно, но сервер старый, 1гб оперативы и 80гб диск (рейд)...

Конвертация базы из sql в dbf
С семеркой дружу плохо, как переконвертировать базу, если есть в наличии каталог базы, но нет зип-архива? Пробовал тупо создать пустую базу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru