-
Подскажите, пожалуйста, у меня есть приходные накладные 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)
|