1

(7 replies, posted in Russian)

Спасибо огромное, ругался на синтаксис, после доработки Работает.

+ решено было использовать временную таблицу. в итоге получилось следующее:

   procedure FrmOne_Button23_OnClick (Sender: TObject; var Cancel: boolean);
var i  : integer;
    s  : string;

begin
    // Задаём переменную (год из календаря)
       s  := (copy(FrmOne.DTP_PayRoll_Year.sqlDate, 2, 4));
    // Удалить временную таблицу
       SQLExecute('DROP TABLE IF EXISTS TemPay');
    // Создать временную таблицу со столбцами....
       SQLExecute('CREATE TEMPORARY TABLE TemPay (id INTEGER NOT null PRIMARY KEY ASC AUTOINCREMENT, RecipientPay TEXT, Transf REAL)');
    // Заполнить временную таблицу. при привышении лимита
       SQLExecute ('insert into TemPay (RecipientPay, Transf) SELECT RecipientPay, IfNull(Sum(TblPayRoll.Transfer), 0) FROM TblPayRoll WHERE Mounth LIKE "'+s+'-%" GROUP BY RecipientPay HAVING IfNull(Sum(TblPayRoll.Transfer), 0) > 240000 ');
    // Если во временной таблице есть хоть одна запись
       if  SQLExecute('Select COUNT(id) FROM TemPay') > 0  then
        begin
         ShowMessage ('Есть получатели с превышением максимального порога');
    // задаём цикл
          for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do
    // ищем совпадения по TG и TT
          If (FrmOne.TG_PayRoll.Cells[17,i] = SQLExecute('SELECT RecipientPay FROM TemPay Where RecipientPay = "'+FrmOne.TG_PayRoll.Cell[17,i].AsString+'" '))then
   // Раскрашиваем
          frmOne.TG_PayRoll.Cell[17,i].Color := $FF00E2;

          end

end;

2

(7 replies, posted in Russian)

sparrow wrote:

проблема в том, что SQLExecute не может вернуть более одной записи.

Хорошо, цикл задан, for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do
теперь нужно получить 1 содержимое ячейки в нашем случае FrmOne.TG_PayRoll.Cell[17,i].AsString
                                        2 найти её в db что то типа   SQLExecute('SELECT RecipientPay FROM TemPay Where RecipientPay = "'+FrmOne.TG_PayRoll.Cell[17,i].AsString+'"')); но это не точно
                                        3. если True найти № строки таблицы (i)
                                        4 раскрасить - frmOne.TG_PayRoll.Cell[17,i].Color := $FF00E2;

логика должна быть примерно такая...

3

(7 replies, posted in Russian)

не выходит цветочек аленький.
проблема в том что (SELECT RecipientPay FROM TemPay Where Transf > 240000)  возвращает более одного совпадения
грид пробегает полностью с первой записью запроса (т.е. если в гриде 2 и более совпадений окрашивает все) а остальные отбрасывает.
Нужен цикл -
либо весь грид пробегать столько раз сколько записей возвращает запрос
либо каждую ячейку проверять столько раз сколько возвращает запрос и переходить к след. ячейке

Добрый день.

нужно подсветить ячейку в гриде по условию


procedure FrmOne_Button23_OnClick (Sender: TObject; var Cancel: boolean);
var s, i: integer;
begin
// проходим по всем строкам таблицы
for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do
// если есть совпадение (данное сравнение возвращает истину или ложь)
           if ((FrmOne.TG_PayRoll.Cell[17,i].AsString) = SQLExecute('SELECT RecipientPay FROM TemPay Where Transf > 240000'))= True then
           begin
            ShowMessage (FrmOne.TG_PayRoll.Cell[17,i].AsString + 'в списке');
            // присваиваем переменную
            s := (i);
            // раскрашиваем ячейку
            frmOne.TG_PayRoll.Cell[17,s].Color := $FF00E2;
           end;
end.

проблема в том что обрабатывается только первая запись db TemPay.RecipientPay
как добиться проверки по всем записям db?

5

(2 replies, posted in Russian)

Пусть мне будет стыдно!)))

6

(2 replies, posted in Russian)

Добрый день Нужна помощь! При попытке сохранить запись в базу выдает ошибку FOREIGN KEY constraint failed.

procedure SaveNewMat();
var idIn : String;
begin
     idIn := SQLExecute('Select id From Invoice WHERE Invoice.id_Seiler = '+FrmInvoiceIn.CBSailer.sqlValue+' AND Invoice.NumInvoice = "'+ FrmInvoiceIn.EdNumInvoice.Text +'" ');
     //Showmessage (idIn);
     SQLExecute('INSERT INTO Material (id_Invoice, id_DictNomenklature, KolVoIN, id_DictEdIzmereniya, PriseIn, id_DictMat_Inst_Obor, id_Work, id_Dogovor, Docs_filename) VALUES ('+idIn+', "'+FrmInvoiceIn.CBMatOfInv.sqlValue+'", '+FrmInvoiceIn.EdKolVo.sqlValue+', "'+FrmInvoiceIn.CBEdIzm.sqlValue+'", "'+FrmInvoiceIn.EdPrise.sqlValue+'", "'+ FrmInvoiceIn.CBCategory.sqlValue+'", "'+ FrmInvoiceIn.CBMatOfWork.sqlValue+'", "'+FrmInvoiceIn.CBMatOfDog.sqlValue+'", "'+FrmInvoiceIn.DBFileMatDocs.dbFileName+'" )')
end;

выяснил что ошибку даёт внешний ключ - id_Invoice, что с этим делать не пойму!

Но попутно созрел ещё один вопрос
Я разрешил редактирование в гриде данной ячейки - Closse.
Соответственно редактируется подставленный скриптом текст как в любом редакторе, соответственно не сохраняется как это было бы при прямом указании на таблицу из грида (там он в виде выпадающего списка из двух значений Да/Нет):
Замутить тот самый выпадающий список возможно?

Спасибо за отсыл в правильном направлении, получилось, но я вставил код в тело запроса:

SELECT NumInvoice AS "№ Счета", strftime("%d-%m-%Y",DataInvoice) AS "от", SummInvoice AS "Сумма", Case Closse When 1 Then "Да" Else "Нет" End AS "Закр." FROM Invoice WHERE...........

Результат достигнут но без костыля....

Добрый день!
Заполнил таблицу SQL запросом в том числе поле да/нет которое отображается в гриде как 1 или 0. Вопрос: как изменить представление на Да / Нет?

Спасибо огромное!
Всё получилось,

Чем отличается .sqlValue от .Text ? содержит экранирующие кавычки

теперь буду знать !)))

Добрый день.
Как не пробую ничего не выходит! код ниже выдает результат по части названия но он регистрозависимый

Select Name AS "Номенклатура"
From DictNomenklature 
WHERE Name LIKE "%БСТ%"

а этот регистронезависимый но по полному названию

Select Name AS "Номенклатура" 
From DictNomenklature 
WHERE Name == 'бСТ В20П4F150W6' COLLATE NOCASE

как получить результат регистронезависимый по части названия
и еще один нюанс т.к. я использую переменную, запрос вида:

SQL := 'Select Name AS "Номенклатура" From DictNomenklature WHERE Name LIKE "%'+Smat+'%"';

выдает пустой результат хотя по логике должен выдать

Добрый день!
Помогите со следующим скриптом:


procedure FrmNomenklature_MemNomenklature_OnChange (Sender: TObject);
var SMat, SQL : string;
begin
    Smat := (FrmNomenklature.MemNomenklature.sqlValue);

    SQL := 'Select DictNomenklature.Name AS "Номенклатура" From DictNomenklature WHERE DictNomenklature.Name == '+Smat+' COLLATE NOCASE ';
  
    FrmNomenklature.BTSQLHomenklature.dbSQL := sql;

end;

под MemNomenklature находится поле MEMO которое лишено плюшек как в Edit облегчающих поиск

В данном виде код работает но нужно чтоб поиск выдавал подстроку (результат по части найденного текста)
Почему то не работают такие как LIKE '%s%' - останавливается на стадии запуска
и WHERE instr (DictNomenklature.Name == '+Smat+', '' (здесь любой существующий в DictNomenklature.Name  символ '') - выдаёт результат без совпадений