Отправил на support@drive-software.com

Как я понял- проблема имеется с поиском по ключевым полям. Уважаемый DriveSoft, не подскажете как можно решить данную проблему?

Дабы не засорять тему в FAQ, опишу проблему тут.
Имеет скрипт

function CheckDublicate (Action, sTable, sField, sValue: string; id: integer;): boolean;
var
   s: string;
begin
      result := False;
          s := SQLExecute ('SELECT Count(*) FROM '+sTable+' WHERE '+sField+' LIKE "' + sValue + '"');
          if StrToInt(s) > 0 then result := True;
 end;

procedure zapic_na_priem_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
    if  CheckDublicate(zapic_na_priem.dbAction, 'zapicnapriem', 'last_name', zapic_na_priem.Last_Name.Text, zapic_na_priem.Button4.dbGeneralTableId) AND
        CheckDublicate(zapic_na_priem.dbAction, 'zapicnapriem', 'first_name', zapic_na_priem.First_Name.Text, zapic_na_priem.Button4.dbGeneralTableId) AND
        CheckDublicate(zapic_na_priem.dbAction, 'zapicnapriem', 'Patronymic', zapic_na_priem.Patronymic.Text, zapic_na_priem.Button4.dbGeneralTableId) AND
        CheckDublicate(zapic_na_priem.dbAction, 'zapicnapriem', 'Address', zapic_na_priem.Address.Text, zapic_na_priem.Button4.dbGeneralTableId) AND
        CheckDublicate(zapic_na_priem.dbAction, 'zapicnapriem', 'day', FormatDateTime('yyyy-MM-DD 00:00:00.000', zapic_na_priem.data.Date), zapic_na_priem.Button4.dbGeneralTableId) AND
        CheckDublicate(zapic_na_priem.dbAction, 'zapicnapriem', 'id_price', Inttostr(zapic_na_priem.Usluga.dbItemID), zapic_na_priem.Button4.dbGeneralTableId)
        then
     begin
          ShowMessage('Данный прием уже существует.');
          Cancel := True;
     end;
     end;

Трабла в следующем. Если не использовать Combobox (zapic_na_priem.Usluga.dbItemID), то все работает норм, в противном случае срабатывает проверка на дубль вне зависимости от полей  'last_name', 'first_name', 'Patronymic', и 'Address', однако возможно записать на другой день.
Например. Сидорова Ивана Ивановича записываю на прием на 01.04.2015 на "лечение зуба" (id_1). Еще раз его открываю, пытаюсь записать его на  "повторный прием" (id_2). Если в таблице 'zapicnapriem' присутствует хоть одна запись, где указано id_2 (вне зависимости от имени, отчества...) то выдается дубль. Может значение Combobox по другому как-то берется?
Update
Проверяю на одном человеке. Действительно, проблема с Combobox. Если в нем не выбираю значения (id_price), то позволяет записать.
Значение id_price меняются, проверял через

zapic_na_priem.Edit1.Text:=Inttostr(zapic_na_priem.Usluga.dbItemID);

Подскажите, а как можно сравнить значение, выбираемое с ComboBox?
Update.
Разобрался

 CheckDublicate(zapic_na_priem.dbAction, 'zapicnapriem', 'id_price', Inttostr(zapic_na_priem.Usluga.dbItemID), zapic_na_priem.Button4.dbGeneralTableId)

Решил.

SELECT
SUM(cena)
,Kvit
,strftime('%d.%m.%Y', zapicnapriem.day) as date
From
ZapicNaPriem
LEFT OUTER JOIN Cena ON Cena.id=zapicnapriem.id_Cena
GROUP BY Kvit

Доброго времени суток.
Имеется sql-запрос вида

SELECT
Kvit
,strftime('%d.%m.%Y', zapicnapriem.day) as date
,Cena
From
ZapicNaPriem
LEFT OUTER JOIN Cena ON Cena.id=zapicnapriem.id_Cena

В результате в гриде получаем следующее
http://s019.radikal.ru/i600/1410/3d/dff478efd9b8.jpg
Но есть проблема - в базе есть несколько поле с одинаковым значением Kvit, и для каждого разная цена.
Можно ли сделать, что бы в гриде отображалось одно значение Kvit, а поле Cena складывалось?

Огромное спасибо!

Доброго времени суток.
Суть сабжа: значение Counter - это номер платежного поручения. В реализации не возникает вопросов если номера начинаются с любого значения, отличного от "0". На данный момент номер "000652" реализуется через значение Counter "652" + в отчете дописывается 000[Report."Counter"]. Некрасиво, в базе не полный номер, но по другому не придумал. Собственно, что хочу переделать. Значение "000ххх" в базу не записать. Есть вариант перед нулями поставить букву, но возникают несколько вопросов: (интересует, правильный ли ход мыслей)
1. Сделать 2 String переменные, A=буква, B=000 и в таблицу через SQL-запрос вносить значение А+B+Counter.
2. Если Counter=999, то каким образом изменить значение на B=00. Правильно ли будет поставить запрос, что то вроде

if Counter.MaxValue > 999
Then
S:=00
if Counter.MaxValue > 9999
Then
S:=0

Может все проще можно сделать и я не в ту сторону смотрю? Искал пример реализации, но к сожалению даже идеи не нашел.

9

(3 replies, posted in Russian)

А как быть, если используется не поле в базе, а сумма?

[SUM(<Report."Predoplata">,MasterData1)]

Доброго времени суток.
DriveSoft, прошу помощи - 3 день голову ломаю...
Имеется две таблицы и 2 SQL-запроса.
Структура первой таблицы ZapicNaPriem

    id           INTEGER PRIMARY KEY ASC,
    Day          TEXT,
    Time         TEXT,
    id_Specializ INTEGER,
    First_Name   TEXT,
    Patronymic   TEXT,
    id_Doctors   INTEGER,
    id_Price     INTEGER,
    id_Cena      INTEGER,
    Address      TEXT,
    Phone        TEXT,
    Kvit         TEXT,
    Last_Name    TEXT,
    id_Referal   INTEGER,
    id_Reforg    INTEGER,
    id_RefSpec   INTEGER 

Структура 2 таблицы MKB10Client

    id              INTEGER PRIMARY KEY,
    id_mkb10        INTEGER,
    id_ZapicNaPriem INTEGER,
    Ishod           TEXT 

Связь между таблицами ZapicNaPriem.id = MKB10Client. id_ZapicNaPriem
2 отдельно работающих sql-запроса

SELECT
strftime('%d.%m.%Y', ZapicNaPriem.Day) AS Day
,Specializ.Spec
,Doctors.Fio
,Price.NameUsluga
,ZapicNaPriem.First_Name
,ZapicNaPriem.Last_Name
,ZapicNaPriem.Patronymic
FROM
ZapicNaPriem

LEFT OUTER JOIN Doctors ON Doctors.id=zapicnapriem.id_Doctors
LEFT OUTER JOIN Specializ ON Specializ.id=zapicnapriem.id_Specializ
LEFT OUTER JOIN Price ON Price.id=zapicnapriem.id_Price

WHERE
ZapicNaPriem.First_Name LIKE '{First_Name}' and
ZapicNaPriem.Last_Name LIKE '{Last_Name}' and
ZapicNaPriem.Patronymic LIKE '{Patronymic}'

2 запрос

SELECT
mkb10client.id
,mkb10.Code
,mkb10.Diagnoz
,Ishod
FROM
mkb10client
LEFT OUTER JOIN MKB10 ON MKB10.id=mkb10client.id_mkb10
where
id_ZapicNaPriem = {id}

Смысл - на одну запись в таблице ZapicNaPriem имеется несколько записей в таблице mkb10client. (аналогия Вашего примера тел. справочника)
Что хочу.
Долго думал как объяснить - проще скрином наверное ) Желтым выделены данные со 2 таблицы.
http://s016.radikal.ru/i336/1408/c8/df69001e5ef9.jpg
Т.е. хочу создать Report, в котором на одну строку с ZapicNaPriem добавить в столбик записи с mkb10client при условии ZapicNaPriem.id = MKB10Client. id_ZapicNaPriem. Пытаюсь через UNION, но не могу понять как во втором запросе правильно прописать условие поиска с другой таблицы

....
from
mkb10client
....
where
id_ZapicNaPriem = ZapicNaPriem.id 

.

Еще вопрос - данный синтаксис для запроса с другой формы правильный?

....
WHERE ZapicNaPriem.id = Form2.{TableGrid1};

1. А как передать потом данный запрос

SQLExecute('SELECT Day, Time, id_Specializ, Last_Name, First_Name, Patronymic, id_Doctors, id_Price, id_Cena, Address, Phone, Kvit, id_Referal, id_Reforg, id_RefSpec, id_mkb10, Ishod FROM ZapicNaPriem WHERE ZapicNaPriem.id = EditPacient.{TableGrid1};')

гриду?
2. Пытался получить значение id в Edit.

Edit_Pacient.Edit2.Text:= VarToStr(SQLExecute('Select id FROM ZapicNaPriem WHERE ZapicNaPriem.id = {TableGrid1};'));

, но если форма вызвана через "Показать запись", а не через "Новая запись", то значение в Edit1 не отображается.
Тупик

А как быть, если гриды расположены на разных формах? Хочу сделать через SQL-запрос

....
WHERE ZapicNaPriem.id = Form2.{TableGrid1};

вот как правильно указать выбранную строку в гриде на другой форме?

1. http://myvisualdatabase.com/forum/misc. … download=1

Пытался через кнопку "Sql запрос", но я так понял не получится. Пытаюсь через скрипт, объявить S: String и в Select вставить переменную...Пока гуглю как вставить переменную в sql запрос, но везде только для Where. (

procedure Edit_pacient_Button8_OnClick (Sender: string; var Cancel: boolean);
var
s: String;
begin
S:=Edit_pacient.Edit1.Text;
SQLExecute('INSERT INTO Temp (Day, Time, id_Specializ, Last_Name, First_Name, Patronymic, id_Doctors, id_Price, id_Cena, Address, Phone, id_Referal, id_Reforg, id_RefSpec, Kvit) SELECT Day, Time, id_Specializ, Last_Name, First_Name, Patronymic, id_Doctors, id_Price, id_Cena, Address, Phone, id_Referal, id_Reforg, id_RefSpec,kvit FROM zapicnapriem2 WHERE ZapicNaPriem2.First_Name LIKE '{First_Name}' and ZapicNaPriem2.Last_Name LIKE '{Last_Name}' and ZapicNaPriem2.Patronymic LIKE '{Patronymic}';');
end;

Пока две проблемы:
1. Не знаю как в SELECT прописать вместо kvit переменную S.
2. Не могу найти где ошибся в синтаксисе. Выдает `)` expected.

Доброго времени суток.
Возможно ли реализовать следующее.
Имеется Table1 и Table2 (2-я база используется как temp).
Имеется SQL-запрос

INSERT INTO Table2
(Day, Time, id_Specializ, Last_Name, First_Name,
Patronymic, id_Doctors, id_Price, id_Cena, Address,
Phone, id_Referal, id_Reforg, id_RefSpec, Kvit)
SELECT
Day, Time, id_Specializ, Last_Name, First_Name,
Patronymic, id_Doctors, id_Price, id_Cena, Address,
Phone, id_Referal, id_Reforg, id_RefSpec, kvit
FROM Table1 

Значение Kvit в обоих базах null.
Требуется при выполнении запроса добавить в Table2 в ячейку Kvit значение Edit1.
Update.
Я так понял нужно использовать

...
ParamByName('kvit').Value:=Form1.edit1.text
FROM Table1

, но выдается ошибка near ".": syntax error

Век живи -век учись. Спасибо.

Еще вопрос.
1.Пытаюсь получить значение последней записи (так же интересует "последняя запись+1")

 Edit_pacient.Edit1.Text:= IntToStr(SQLExecute('SELECT record_count FROM Counter WHERE id = ' + IntToStr(Last_Insert_id('Counter')) +';'));

но возвращается 0. Где я ошибаюсь?

19

(237 replies, posted in Russian)

Добавить в меню "О программе" подменю "Справка". Как вариант - в корне проекта (или в папке Help) располагался бы файлик help.chm, который отображался бы по вызову подменю.

20

(237 replies, posted in Russian)

Есть FR https://code.google.com/p/laalaa/downlo … ys-Windows с поддержкой импорта Word/Excel. Вы отдельно запускаете FR, делаете импорт и сохраняете в файл отчетов.

21

(2 replies, posted in Russian)

Спасибо за линк.
Конкретного ответа не нашел, но смысл реализации понял. (может кому потребуется)
1. Дублирование половины листа.
После Footer основного отчета создаете Subreport (растягивать на лист не обязательно). На созданном Page2 делаете копию Page1. Одно "но" - PageHeader в SubReport не отображается при печати. Решается копированием данных с PageHeader Page1 и вставкой после Footer на Page1. (т.е. прямо на SubReport). Header, MasterData и Footer на Page2 создаете новые (не забываем привязывать MasterData к Report). Недостаток этого способа: если отчет больше половины листа - subreport на Page2 отобразится неправильно. Если кто найдет другой способ - поделитесь.
2. Печать на 2-м листе (имеется ввиду не продолжение отчета, а новая форма с данными из Report).
Просто разместить данные с Report не получится. Необходимо создать новые Header, MasterData (с привязкой к Report) и Footer. В моем случае это был договор на A4 со вставками ФИО и даты и т.д. Вы можете просто растянуть Header на весь лист - все данные с Report отображаются корректно.

22

(2 replies, posted in Russian)

Имеется отчет на половину листа А4. Возможно ли встроенными средствами FR сделать копию на вторую половину листа?
Update
Разобрался, это делается через SubReport.
Появился другой вопрос. Создаю Page3 (на page2 subreport). Хочу сделать просто набор текста со вставками из Report. Текст отображает, но, например Memo  [Report."Phone"] нет.

Понял. Еще одно уточнение. Можно ли сделать, что бы в условии WHERE была не константа (id=5), а последняя запись в таблице? Т.е. своеобразный счетчик.

Не меняет значение.
Я собственно вот это хотел сделать, но тоже на работает.

SQLExecute ('UPDATE tablename SET record_count=record_count+1;');

В tablename кроме счетчика полей нет.

Доброго времени суток.
Возможно ли через скрипт (sql-запрос) изменить начальное значение счетчика?
Например. В базе стоит счетчик с начальным значением (COUNTER:8001). Как программно изменить на 8002?