Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Datasnap.clientdataset и FDQuery вызивают "Field value required" / 8 сообщений из 8, страница 1 из 1
29.11.2017, 05:33:06
    #39560989
bastibubu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Datasnap.clientdataset и FDQuery вызивают "Field value required"
Datasnap. Delphi 10.2, firebird 3
Процедура выбирает записи из бд клиентов и отправляет на сервер.

в while цикле с помощью FDQuery1 перебираю неотправленные записи, встаю в конце датасета cdsSelectCountry, а второй датасет (cdsInsertCountry) делает вставку и потом отправляется на сервер.

cdsCountry1-выбирает записи из бд клиента
cdsSelectCountry-чтобы узнать номер последней записи
cdsInsertCountry- вставка в конце

в обойх датасетах(cdsSelectCountry, FDQuery1) есть required поля и last и next вызивают исключение : "Field value required"

required:=false ничего не меняет. Что можно сделать?

Код: pascal
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.
procedure Tclient.ButtonCountryClick(Sender: TObject);
var
n:integer;
begin
NullStrictConvert := false;

 DBGridClient.DataSource:=clientmodule1.dsCountry1;
 clientmodule1.cdsCountry1.Open;

 while not clientmodule1.FDQuery1.Eof do begin
   try
     clientmodule1.cdsSelectCountry.Open;  // для номера последней записи
     clientmodule1.cdsSelectCountry.last;
     n:=clientmodule1.cdsSelectCountry.FieldByName('Country_uid').AsInteger;
     clientmodule1.cdsSelectCountry.Append;
     clientmodule1.cdsSelectCountry.Edit;
     clientmodule1.cdsSelectCountry.FieldByName('Country_uid').AsInteger:=n+1;
     Clientmodule1.cdsInsertCountry.close;
     Clientmodule1.cdsInsertCountry.ParamByName('country_id').Value:=
                                   Clientmodule1.CdsCountry1.FieldByName('country_id').AsInteger;
     Clientmodule1.cdsInsertCountry.ParamByName('name').Value:=
                                   Clientmodule1.CdsCountry1.FieldByName('name').AsWidestring;
     Clientmodule1.cdsInsertCountry.ParamByName('Firmcode').Value:=
                                   Clientmodule1.CdsCountry1.FieldByName('firmcode').AsInteger;
     Clientmodule1.cdsInsertCountry.Execute;
 

     clientmodule1.FDQuery1.edit;
     clientmodule1.FDQuery1.FieldByName('tr').AsWidestring:='1';
     clientmodule1.FDQuery1.FieldByName('st').AsWidestring:='s';
     clientmodule1.FDQuery1.next;

   finally
   end;
 end;
clientmodule1.cdsInsertCountry.ApplyUpdates(-1);
end;
...
Рейтинг: 0 / 0
29.11.2017, 10:31:43
    #39561087
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Datasnap.clientdataset и FDQuery вызивают "Field value required"
Мне всегда было интересно, зачем пишут конструкцию

Код: pascal
1.
2.
3.
4.
try
...
finally
end;



Какой сакральный смысл в этом культе карго ?
...
Рейтинг: 0 / 0
29.11.2017, 10:38:46
    #39561096
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Datasnap.clientdataset и FDQuery вызивают "Field value required"
bastibubuв обойх датасетах(cdsSelectCountry, FDQuery1)cds через провайдера ссылается на этот FDQuery1?
bastibubuесть required поляу FDQuery1 созданы все персистентные в дизайне?
bastibuburequired:=false ничего не меняета у полей какого датасета меняешь?
bastibubuЧто можно сделать?предполагая что корень проблемы в FDQuery1 оттрейсить файрдак если так понять не удается отчего и какое поле он считает обязательным к заполнению
schiМне всегда было интересно, зачемвозможно чтобы дать повод таки засрать тред даже если по теме сообщить нечего? ;)
...
Рейтинг: 0 / 0
29.11.2017, 14:21:39
    #39561278
bastibubu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Datasnap.clientdataset и FDQuery вызивают "Field value required"
vavancds через провайдера ссылается на этот FDQuery1?
vavan , FDQuery1 для вывода данных из бд клиента:
Код: sql
1.
2.
3.
FDConnection1-->FDQuery1-->datasetProvider-->datasource-->свой cliendataset 
SqlConnection1--> ServerMethodInsert-->свой Provider--cdsInsertCountry-->datasource-->свой DBGrid 
SqlConnection1--> ServerMethodSelect-->свой Provider--cdsSelectCountry-->datasource-->свой DBGrid 



cdsInsertCountry-для вставки записей в clientdataset сервера.
что касается cdsSelectCountry вынужденная мера-придумал чтобы обойти вывод этой ощибки при append в clientdataset сервера. Поэтому clientmodule1.cdsSelectCountry.FieldByName('Country_uid').AsInteger:=n+1 даёт уникальный номер для Country_uid(unique, primary key) и потом уже не выводит ощибку Field value required.

Процедура работает приблизительно так:

Код: pascal
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.
procedure Tclient.ButtonCountryClick(Sender: TObject);
begin

открывает датасет клиента FDQuery1 ;

 while not датасет клиента( т.е. FDQuery1).Eof do begin
 
     clientmodule1.clientdataset сервера.open;
     clientmodule1.clientdataset сервера.last;
     n:=последный Country_uid.AsInteger;
     Append;
     Edit;
     Country_uid'.AsInteger:=n+1;
     
     потом идёт вставка в clientdataset сервера:
     Clientmodule1.cdsInsertCountry.close;
     Clientmodule1.cdsInsertCountry.ParamByName('country_id').Value:=
                                   Clientmodule1.CdsCountry1.FieldByName('country_id').AsInteger;
     Clientmodule1.cdsInsertCountry.ParamByName('name').Value:=
                                   Clientmodule1.CdsCountry1.FieldByName('name').AsWidestring;
     Clientmodule1.cdsInsertCountry.ParamByName('Firmcode').Value:=
                                   Clientmodule1.CdsCountry1.FieldByName('firmcode').AsInteger;
     Clientmodule1.cdsInsertCountry.Execute;
 

     в FDQuery1 клиента отметить что уже пересланы на сервер:
     clientmodule1.FDQuery1.edit;
     clientmodule1.FDQuery1.FieldByName('tr').AsWidestring:='1'; //переслан
     clientmodule1.FDQuery1.FieldByName('st').AsWidestring:='s'; //статус:=зафиксирован
     clientmodule1.FDQuery1.next;
 

     clientmodule1.cdsInsertCountry.ApplyUpdates(-1);
end;
    FDConnection1.applyUpdates([FDQuery1]);
end;

 
...
Рейтинг: 0 / 0
29.11.2017, 14:41:23
    #39561297
bastibubu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Datasnap.clientdataset и FDQuery вызивают "Field value required"
vavanbastibubuесть required поляу FDQuery1 созданы все персистентные в дизайне?
vavan , эти поля в бд required, not null. Fields Editor компонента FDQuery1 пустой или добавляю все поля (add all fields) и required:=false ничего не меняет.
тоже самое у clientdataset-а cdsSelectCountry.

bastibubuпредполагая что корень проблемы в FDQuery1

использование FDQuery была вынужденная мера после проблемы с клиентдатасетом.
...
Рейтинг: 0 / 0
29.11.2017, 15:11:37
    #39561324
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Datasnap.clientdataset и FDQuery вызивают "Field value required"
bastibubu, иксепшн "Field value required" откуда прилетает? название поля там указано?
bastibubuFields Editor компонента FDQuery1 пустой или добавляю все поля (add all fields) и required:=false ничего не меняетоттрейсить и разобраться
bastibubuтоже самое у clientdataset-а cdsSelectCountrycds вообще пока исключи, он если открывается через провайдера то метаданные берутся из исходного датасета и на уровне полей cds задавать бесполезно
...
Рейтинг: 0 / 0
29.11.2017, 16:34:45
    #39561410
bastibubu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Datasnap.clientdataset и FDQuery вызивают "Field value required"
vavanbastibubu, иксепшн "Field value required" откуда прилетает? название поля там указано?
vavan , нет, не указано, но выдно что Country_uid (not null, Primary key таблицы сервера) добавляется и ругается на country_id(первычный ключ таблицы клиента). В принципе,в конкретном случае, можно на стороне сервера country_id.required:=false но ищу более обобщенное решение.
(см. фото)
...
Рейтинг: 0 / 0
29.11.2017, 18:39:13
    #39561554
bastibubu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Datasnap.clientdataset и FDQuery вызивают "Field value required"
vavan , ещё забыл сказать-
на кнопке закрепил оператор
Код: pascal
1.
clientmodule1.FDQuery1.next; 


и испольняется без ощибки!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Datasnap.clientdataset и FDQuery вызивают "Field value required" / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]