-
Подскажите, пожалуйста, у меня есть приходные накладные TOV_IN(поля id, id_tov, price, quantity), мне нужно распечатать этикетки на весь товар который пришел, причем количество этикеток должно быть равным quantity.
Для печати этикеток я деляю SQL-запрос
select id_tov,price,quantity from TOV_IN, у меня получается
товар1 22,20 2
товар2 10,45 1
товар3 18,63 3А как можно чтобы получать следующее?
товар1 22,20 2
товар1 22,20 2
товар2 10,45 1
товар3 18,63 3
товар3 18,63 3
товар3 18,63 3
-
не надо так делать
-
Но мне нужно продублировать строку столько же раз сколько указано в поле quantity
как можно чтобы получать следующее?
товар1 22,20 2
товар1 22,20 2
товар2 10,45 1
товар3 18,63 3
товар3 18,63 3
товар3 18,63 3
-
> как можно чтобы получать следующее?
> товар1 22,20 2
> товар1 22,20 2
А зачем тогда поле Quantity в результирующем наборе ?
-
Извините, оно ненужно
товар1 22,20
товар1 22,20
товар2 10,45
товар3 18,63
товар3 18,63
товар3 18,63
-
Т.е. ты хочешь одним-единственным SQL-запросом получить желаемое ?
Или все же тобой допускаются некие впомогательные телодвижения для получения требуемого НД ?
-
Я потом этот НД выгружаю в FreeReport, но там я не знаю как повторить MasterData1 определенное количество раз, поэтому спрашиваю может быть возможно это реализовать SQL-запросом.
-
> потом этот НД выгружаю в FreeReport
Самое простое и очевидное - воспользоваться компонентом TfrxUserDataSet как посредником между FR-отчетом и НД, возвращенным в результате SQL-запроса.
-
> AlexeyMir
попробуй написать процедурку с циклом
-
Вот пример :
procedure TfrmDocument.frxUDSCheckEOF(Sender: TObject; var Eof: Boolean);
begin
Eof := CDS.Tag = 0;
end;
procedure TfrmDocument.frxUDSFirst(Sender: TObject);
begin
CDS.First;
if not CDS.Eof then
CDS.Tag := CDS.FieldValues['Quantity']
else
CDS.Tag := 0;
end;
procedure TfrmDocument.frxUDSGetValue(const VarName: String; var Value: Variant);
begin
Value := CDS.FieldValues[VarName];
end;
procedure TfrmDocument.frxUDSNext(Sender: TObject);
begin
CDS.Tag := CDS.Tag - 1;
if CDS.Tag = 0 then begin
CDS.Next;
if not CDS.Eof then
CDS.Tag := CDS.FieldValues['Quantity']
else
CDS.Tag := 0;
end;
end;
procedure TfrmDocument.frxUDSPrior(Sender: TObject);
begin
CDS.Tag := CDS.Tag + 1;
if CDS.Tag > CDS.FieldValues['Quantity'] then begin
CDS.Prior;
if not CDS.Bof then
CDS.Tag := CDS.FieldValues['Quantity']
else
CDS.Tag := 0;
end;
end;
Здесь CDS - любой компонент-наследник TDataSet, управляющий активным двунаправленным НД, полученным в рез-те SQL-запроса.
-
Можно и SQL-запросом. С подвыподвертом.
-
> Ega23 © (06.08.08 10:36) [10]
Даже если можно, нет ни малейшего резона тянуть с сервера явно избыточную инф-цию, в то время как ее расчудесно с минимальными потугами можно сообразить на клиентской стороне. Тем более что фигурирует FR, который для подобных выкрутасов предоставляет простейший управляемый прокси-дейтасет в виде UDS-компонента.
-
> нет ни малейшего резона тянуть с сервера явно избыточную
> инф-цию, в то время как ее расчудесно с минимальными потугами
> можно сообразить на клиентской стороне
Кто-ж спорит-то?? Я из чисто академического интереса...
-
Из чисто академического резонно было бы поинтересоваться конкретной СУБД, на которой преполагается реализация подобного запроса)
-
используй CDS и плоди записи столько раз, сколько тебе нужно. это чтобы на каждое изделие налепить?
-
> резонно было бы поинтересоваться конкретной СУБД, на которой
> преполагается реализация подобного запроса)
После этого тебя надо было бы расстрелять, т.к. это очень секретная СУБД. :)
В принципе, для FB, MSSQL и Postgres я такой запрос напишу.
Только он воистину нафик не нужен...
-
СУБД - Firebird
>В принципе, для FB, MSSQL и Postgres я такой запрос напишу.
Можно поинтересоваться, как все-таки такой запрос выглядит?
-
> AlexeyMir (06.08.08 11:17) [16]
Ты тоже академик ?)
-
> Можно поинтересоваться, как все-таки такой запрос выглядит?
В виде ХП, Один цикл по начальному НД, на каждой итерации доп. цикл от 1 до Quantity.
-
> В виде ХП
В ХП и дурак смогет)
Ты сотвори базовыми средствами хотя бы sql'92)
-
> Сергей М. © (06.08.08 11:51) [19]
Если 2,х , то EXECUTE BLOCK
-
> Ты сотвори базовыми средствами хотя бы sql'92)
Вот мне делать нечего... :)))
-
Переход значения в измерение не м.б. реализован никаким сколь угодно сложным запросом.
А программно всякий сможет. Или почти всякий...:)
-
select * from mytable, my_dummy_table_with_n_record
where mytable.qtty = n
[union]
.......
-
> Johnmen © (06.08.08 12:29) [22]
Наверное можно, используя доп.таблицу dop:
quantity
1
2
2
3
3
3
...
1000000
1000000 (миллион записей)
1000000
тогда
select id_tov,price
from TOV_IN,dop
where TOV_IN.quantity=dop.TOV_IN
но надо ли?
-
совпадушка
-
> Евгений Р. (06.08.08 12:44) [24]
А поддерживать таблицу разве можно без запросов?
:)
-
создать одноразово, предусмотрев максимальное количество. Справочник своего рода.
-
Cлово "поддерживать" никак не связано со словом "создать" :))