Страница 1 из 2

DateTimePicker & Interbase

Добавлено: 03 янв 2008, 20:58
Дмитрий Б.
Здравствуйте.

Есть компонент DateTimePicker. А есть-ли подобный компонент для работы с Interbase.

Может есть другой способ ввода даты из стандартого DateTimePicker в Interbase?

Подскажите, есть-ли способ ввода даннных минуя компоненты DataControl-s. Приведите пожалуйста пример.

Спасибо.

Добавлено: 03 янв 2008, 22:06
Attid
пример :

Код: Выделить всё

mydataset.parambyname('mydate').asdate := DateTimePicker.date

Добавлено: 03 янв 2008, 22:39
Дмитрий Б.
Сделал так:

IBDataSet1->ParamByName("DT_INPUT")->AsDate = DateInput->Date;

Поле для даты DT_INPUT, но выдает ошибку Field "DT_INPUT" not found.

Ничего не понимаю.

Добавлено: 03 янв 2008, 23:20
kdv
Ничего не понимаю.
http://www.ibase.ru/ibfaq.htm#dtproblem

Добавлено: 04 янв 2008, 10:15
Дмитрий Б.
Таблица создавалась в IBExpert имена полей набирал в верхнем регистре

Код: Выделить всё

...
DT_INPUT         date
DT_OUTPUT      date
NO_PL              integer
...
поэтому и использовал " ".
Тем более, что при других вариатах ' ' или без них Билдер ругается.

Добавлено: 04 янв 2008, 14:12
Дмитрий Б.
Попробовал сделать по другому, но ничего не получается. Делаю следующим образом. (BDS 2006 - C++)

Код: Выделить всё

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
  AnsiString FurmNum, Date_Input, Date_Output, Prich_Vivoda, Notes, ALL; 
  FurmNum = ComboBox1->Text; 
  Date_Input = DateToStr(DateInput->Date); 
  Date_Output = DateToStr(DateOutput->Date); 
  Prich_Vivoda = Memo1->Text; 
  Notes = Memo2->Text; 
  ALL = "insert into STOYKOST_FURM(DT_OUTPUT, NOTES, PRICH_ZAMENI) values (\""+Date_Output+ 
      "\",\""+Prich_Vivoda+"\",\""+Notes+"\");"; 
  IBScript1->Script->Clear(); 
  IBScript1->Script->Text = ALL; 
  IBScript1->ExecuteScript(); 
}
Как быть. А как можно сделать компонент который наследовал свойства DBComboBox но с "пристегнутым" календарем. :-)

Добавлено: 04 янв 2008, 14:12
Attid
что в IBDataSet1 за запрос пихаешь ? покажи код.

Добавлено: 04 янв 2008, 16:43
Дмитрий Б.
Таблица содержащая 2 поля с датой (начало и конец) и другие поля например текстовые.

Хотелось, чтобы была возможность добавления и редактирования записей, но не получается сделать так, чтобы выбирать дату как в компоненте TDateTimePicker.

Добавлено: 06 янв 2008, 13:05
Attid
1. ощущение что ты сам не понимаешь что ты хочешь.

2. на вопрос ты не ответил, других вопросов не будет.

Добавлено: 06 янв 2008, 15:00
kdv
к тому же, выполнять ОДИН запрос через IBScript - это изврат. Похоже, www.ibase.ru/devinfo/ibx.htm ты не читал.

Добавлено: 08 янв 2008, 12:48
Дмитрий Б.
Я то понимаю что я хочу - чтобы добавлять и редактировать записи в базе данных посредством компонетов не отосящихся к группе DataControls, а использовать ComboBox, Memo, и особенно DateTimePicker, так как нет подобого компонента для работы с базой :-(

Поэтому я вижу только один выход считывать данные из компонентов программно и добавлять данные в таблицу через запрос.

Поправьте меня если я не правильно мыслью.

В IBDataSet1 я ничего не пихаю, там автоматически все сгенерировалось, а именно:

Код: Выделить всё

delete from STOYKOST_FURM
where
  DT_INPUT = :OLD_DT_INPUT and
  NO_FURMI = :OLD_NO_FURMI

insert into STOYKOST_FURM
  (DT_OUTPUT, NOTES, PRICH_ZAMENI)
values
  (:DT_OUTPUT, :NOTES, :PRICH_ZAMENI)

update STOYKOST_FURM
set
  DT_OUTPUT = :DT_OUTPUT,
  NOTES = :NOTES,
  PRICH_ZAMENI = :PRICH_ZAMENI
where
  DT_INPUT = :OLD_DT_INPUT and
  NO_FURMI = :OLD_NO_FURMI

Select 
  DT_INPUT,
  DT_OUTPUT,
  NO_FURMI,
  NOTES,
  PRICH_ZAMENI,
  STOYKOST
from STOYKOST_FURM 
where
  DT_INPUT = :DT_INPUT and
  NO_FURMI = :NO_FURMI
Питаюсь добавить новую запись таким образом:

Код: Выделить всё

  IBScript1->Script->Clear();
  IBScript1->Script->Text = "insert into STOYKOST_FURM(DT_OUTPUT, NOTES, PRICH_ZAMENI) values (\""+ DateToStr(DateTimePicker2->Date) +"\",\""+ Memo1->Text +"\",\""+ Memo2->Text +"\");";
  IBScript1->ExecuteScript();
но выдает исключение:

Код: Выделить всё

Dinamic SQL Error
с кодом -206
Неизвестный столбец и пишет текст который был в компоненте (например Дату в DateTimePicker1->Date или Текст в Memo1->Text)
По поводу использования IBScript вместо IBQuery, это временно, пока я не пойму что и как. Короче говоря - это пока не так важно.

Добавлено: 08 янв 2008, 16:08
DMA
Попробуй дату в одинарные кавычки помещать.

Добавлено: 08 янв 2008, 16:44
kdv
работай через параметры. и читай ibx.htm еще раз.

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

и опять. одиночные запросы НЕ НАДО выполнять в IBScript. Надо в IBQuery или IBSQL. IBScript предназначен для СКРИПТОВ, т.е. МНОЖЕСТВА SQL-команд, выполняемых одним "блоком" (все равно поштучно).

см. ibx.htm

Добавлено: 09 янв 2008, 10:21
Attid
Дмитрий Б. писал(а):Я то понимаю что я хочу - чтобы добавлять и редактировать записи в базе данных посредством компонетов не отосящихся к группе DataControls, а использовать ComboBox, Memo, и особенно DateTimePicker, так как нет подобого компонента для работы с базой :-(
компонент для работы с датой есть в RXlib.


а если хочешь работать с базой ручками, то kdv тебя уже отправил, читай про IBQuery и параметры. пример я тебе дал еще во втором сообщении и ты его игнорируешь.

если у тебя есть датасет нафиг тебе еще и скрипт ?
будет что-то вроде
IBDataset->insert;
IBDataset->parambyname('DT_OUTPUT').asdate := lalala ;
IBDataset->parambyname('NOTES').asstring := lalala ;
IBDataset->parambyname('lalal').aslalalal := lalala ;
IBDataset->post;
transaction->commit;

Добавлено: 15 янв 2008, 17:48
Дмитрий Б.
Спасибо за ответы. Я все-таки сделал через через SQL

Код: Выделить всё

FormMain->IBQuery1->SQL->Add("INSERT INTO STOYKOST(NO_FURM,     DT_INPUT, DT_OUTPUT, STOYKOST, PRICH_ZAMENI, NOTES)");
FormMain->IBQuery1->SQL->Add("VALUES('"+CBNoFurm->Text+"', '"+
    				    DT_Input->Date.DateString()+"', '"+
    				    DT_Output->Date.DateString()+"', '"+
    				    Stoykost+"', '"+
    				    MemPrich->Text+"', '"+
    				    MemNotes->Text+"');");

Добавлено: 15 янв 2008, 18:25
kdv
Я все-таки сделал через через SQL
и сделал без параметров. Что будет, если например ты укажешь на клиентской машине разделитель дат как "/" ?

Добавлено: 07 фев 2008, 15:44
Дмитрий Б.
kdv писал(а): и сделал без параметров. Что будет, если например ты укажешь на клиентской машине разделитель дат как "/" ?
Я думаю, что задать как "/" не получится, т.к. использую компонент DateTimePicker, который этого зделать не даст :D.

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

Есть поле типа ДАТА, допускаются пустые значения. Например при добавлении новой записи это поле может быть не заполнено. При этом поле остается со значением НУЛЛ.

Допустим в это поле внесли дату, а затем ее надо убрать (зделать пустым).

Я пробовал присваивать НУЛЛ или пустую строку (""), но это вызывает ошибку.

Подскажи пожалуйста, как это можно осуществить?

Добавлено: 07 фев 2008, 16:27
kdv
Я пробовал присваивать НУЛЛ или пустую строку (""), но это вызывает ошибку.
как именно пробовал?

Добавлено: 08 фев 2008, 00:07
Kotъ-Begemotъ
Дмитрий Б. писал(а):Тут возникла другая проблема, которую решить у меня не получается:

Есть поле типа ДАТА, допускаются пустые значения. Например при добавлении новой записи это поле может быть не заполнено. При этом поле остается со значением НУЛЛ.

Допустим в это поле внесли дату, а затем ее надо убрать (зделать пустым).

Я пробовал присваивать НУЛЛ или пустую строку (""), но это вызывает ошибку.

Подскажи пожалуйста, как это можно осуществить?

Код: Выделить всё

DatasetDataField.Clear;

Добавлено: 08 фев 2008, 10:35
Дмитрий Б.
[/quote]
как именно пробовал?[/quote]

Пробовал двумя способами.
1) DATE TmpDateOut
2) AnsiString TmpDateOut
но оба провалились
в первом случает - ошибка что-то невозможное с (0).
во втором тоже самое, но только с ("")

Код: Выделить всё

if(ChBDtOut->Checked == true) 
{ 
 1) TmpDateOut = DT_Output->Date; 
 2) TmpDateOut = DT_Output->Date.DateString(); 
} 
else 
{ 
 1)   TmpDateOut = NULL; 
 2)   TmpDateOut = "";    
} 
IBQuery1->Active = false; 
IBQuery1->SQL->Clear();          
tmp2 = "update stoykost set      
   DT_OUTPUT='" + TmpDateOut + "', STOYKOST=" + Stoykost + ", PRICH_ZAMENI='" + MemPrich->Text + "', NOTES='" + MemNotes->Text + "' where NO_FURM='" + tmpNo_Furm + "' and DT_INPUT='" + tmpData_Input +"'"; 
IBQuery1->SQL->Add(tmp2); 
IBQuery1->Active = true; 
} 
А по поводу

Код: Выделить всё

DatasetDataField.Clear;
не уверен, т.к. мне необходимо сделать пустой не все поля записи а только DT_OUTPUT (Дата), при чем этом желательно выполнить через SQL в общем запросе (см выше).

Как быть?