Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Вопрос-Ответ Новый топик    Ответить
 EXISTS  [new]
Kapibara
Member

Откуда:
Сообщений: 45
Снова обращаюсь к могучему международному разуму.
Есть таблица "Счет", и таблица "Оплата".
Пока не было оплаты счета, в таблице Счет вычисляемая ячейка пустая, Счет.Оплата = null.
Как только происходит оплата, в ячейке Счет.Оплата появляется вычисленное значение суммы всех оплат по счету.

Но есть ситуация, когда происходит отгрузка без оплаты, и чтобы долг был не null, а цифрой, надо чтобы в таблицу ОПЛАТА вносилась нулевая сумма.

Вопрос, как с помощью exist сделать проверку, что если счет не оплачивался, то вносится нулевая оплата. *я могу реализовать это более долгим способом, но хочется красиво.*

Мой неработающий пример:
if EXISTS
  (SELECT summ, schet.number 
   FROM oplata 
   right join 
       schet on oplata.schet_id = schet.id 
   WHERE 
       (oplata.summ is null) and 
       (schet.number = ... ) 
   )
then
  begin
    INSERT INTO oplata (summ, schet_id, client_id)
           values ...
  end

Спасибо.
23 ноя 10, 11:25    [9823774]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
Kapibara
Member

Откуда:
Сообщений: 45
То есть в этом примере я проверяю, есть ли такой счет с оплатой = null, если существует, то я вношу оплату равную "0", чтобы при вычислении долга была сумма, а не пустая ячейка.
23 ноя 10, 11:28    [9823809]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
Kapibara
Member

Откуда:
Сообщений: 45
Прошу прощения, ячейка не СЧЕТ.ОПЛАТА, а просто ОПЛАТА. Она вычисляемая как SUM(OPLATA.SUM).
23 ноя 10, 11:35    [9823892]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
Kapibara
Member

Откуда:
Сообщений: 45
Я так и не нашел решения одним запросом, и сделал так:
//Если отгружено без денег, чтобы отображался долг. В таблицу оплата вностится оплата с 0 суммой.
          IBQuery1.Close;
          IBQuery1.SQL.Clear;
          select:= 'SELECT oplata.summ, schet.number, oplata.client_id FROM oplata right join schet on oplata.schet_id = schet.id WHERE (oplata.summ is null) and (schet.number = ' + CHAR(39) + ListBox2.Items[I] + CHAR(39)  + ') GROUP BY oplata.summ, schet.number, oplata.client_id';
          IBQuery1.SQL.Add(select);
          IBQuery1.Open;
// Если не было оплат
          if Form6.IBQuery1.fieldbyname('summ').IsNull
            then
//то
              begin
                IBQuery1.Close;
                IBQuery1.SQL.Clear;
                select:= 'INSERT INTO oplata (summ, schet_id, client_id) values (0,' + '(Select ID FROM schet Where schet.number = ' + CHAR(39) + ListBox2.Items[I] + CHAR(39) + '),' + '(Select ID FROM Client Where CLIENT.CLIENT_NAME = ' + CHAR(39) + Combobox1.Text + CHAR(39) + '))';
                IBQuery1.SQL.Add(select);
                Edit5.text := select;
                IBQuery1.Open;
              end;
24 ноя 10, 10:46    [9829689]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6725
Kapibara,

INSERT INTO ...
SELECT ...
WHERE EXISTS
30 ноя 10, 13:21    [9862667]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
Поскольку вы всё равно дошли до того, что вносите в таблицу нулевую оплату, то почему бы не проделать эту операцию сразу - при создании счёта?
30 ноя 10, 15:57    [9864198]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить