Страница 1 из 1

запрос внутри sqlFetch

Добавлено: 25 июл 2013, 11:08
novichok
Подскажите, можно внутри sqlFetch сделать другой запрос?

Код: Выделить всё

while sqlFetch(stmt) = tsOk do
  { ...
    stmt1 := sqlAllocStmt;
      sqlBindCol(stmt1, 1, kol_1);
      sqlBindCol(stmt1, 2, kol_2);
      sqlBindCol(stmt1, 3, kol_3);
      sqlBindCol(stmt1, 4, kol_4);
      sqlAddStr(query1,'select katos.innum,katos.nameos,katos.zavnom,katos.datek from katos where chigheros=#comp(0'+substr(kol14,2,15)+'h)');
      k_osh:=sqlPrepare(stmt1,query1);
      if k_osh>0 then message('sqlPrepare1. Ошибка '+k_osh);
      k_osh:=sqlExecute(stmt1);
      if k_osh>0 then message('sqlExecute1. Ошибка '+k_osh);
      if k_osh=0
      while sqlFetch(stmt1) = tsOk do  ...}

sqlPrepare ошибку не пишет, а вот sqlExecute пишет ошибку 311
Если не внутри sqlFetch - нормально работает :o

Re: запрос внутри sqlFetch

Добавлено: 25 июл 2013, 11:29
Den
Могу ошибаться, но, помоему, такое не прокатывало..
p.s. для такого простого запроса как у Вас(по крайней из того кода что Вы предоставили ), вряд ли нужен dsql.

Re: запрос внутри sqlFetch

Добавлено: 25 июл 2013, 11:39
RAJAH
novichok писал(а):можно внутри sqlFetch сделать другой запрос?
Встречный вопрос - зачем? Лучше, наверное, сделать всё в одном запросе.
novichok писал(а):#comp(0'+substr(kol14,2,15)+'h)')
Не так. В качестве аргумента функции #comp() нужно подставить десятичное представление типа comp (что-то вроде 281474976721982).

Re: запрос внутри sqlFetch

Добавлено: 25 июл 2013, 11:49
novichok
В первом запросе получается список ос в залоге

Код: Выделить всё

sqlAddStr(query,'select a.name,a.nom_kred_dog,a.dat_kred_dog,a.nom_dog_zalog,a.dat_dog_zalog,a.dat_kon_zalog,');
  sqlAddStr(query,'a.innum,a.nameos,a.zavnom,a.datek,');
  sqlAddStr(query,'a.sumaval/b.vdouble,b.vdouble,a.sumaval,a.katosnrec,a.isleaf from ');
  sqlAddStr(query,'(select katorg.name,veksl.nodoc nom_kred_dog,veksl.datvip dat_kred_dog,');
  sqlAddStr(query,'dogovor.nodoc_ext nom_dog_zalog,dogovor.ddoc dat_dog_zalog,dogovor.dend dat_kon_zalog,');
  sqlAddStr(query,'katos.innum,katos.nameos,katos.zavnom,katos.datek,aval.sumaval,aval.nrec,katos.nrec katosnrec,katos.isleaf ');
  sqlAddStr(query,'from katos,aval,veksl,katorg,dogovor where ');
  sqlAddStr(query,'(katos.nrec=aval.corg) and (aval.cveksl=veksl.nrec) and (veksl.cplat=katorg.nrec) and (aval.caval=dogovor.nrec)) a ');
  sqlAddStr(query,'left join (select aval.nrec,attrval.vdouble from aval,attrval,attrnam ');
  sqlAddStr(query,'where (aval.nrec=attrval.crec) and (attrval.cattrnam=attrnam.nrec) and (attrnam.name='#39+'Поправочный коэффициент'#39+')) b ');
  sqlAddStr(query,'on a.nrec=b.nrec ');
  sqlAddStr(query,'order by a.name,a.dat_kred_dog,a.dat_dog_zalog,a.nom_dog_zalog,a.innum ');     
Некоторые из них - сложные объекты, для них надо выбрать их "составные объекты".
Когда результат большого запроса пишу в excel (в этом самом sqlFetch), первое, что пришло в голову - если сложный объект, вторым запросом выцепить его части,
записать в excel, и продолжать писать строки из главного запроса. Если это невозможно, что ж тогда делать?

Re: запрос внутри sqlFetch

Добавлено: 25 июл 2013, 12:00
Den
самое первое что приходит в голову - сохранить результат это большого запроса в временную таблицу и потом сделав Loop по ней довывести "его части"..

Re: запрос внутри sqlFetch

Добавлено: 25 июл 2013, 12:04
RAJAH
novichok писал(а):where katos.nrec=aval.corg
Ой, медленно будет... Связывать по join нужно.

Re: запрос внутри sqlFetch

Добавлено: 25 июл 2013, 12:42
edward_K
1. Внутри не прокатывало эт точно - смотрите ms70drv.log - там что то писалось.
2. Лучше сразу выгрузить во времянку чем через fetch заполнять. В create view в select луше написать tmp_table.* - на mssql иногда не прокатывало без этого.
sqlPrepare(stmt, sSQLCommand)
sqlFetchInto(stmt,tnTmp_table)
- так и код короче и пашет быстрее.
3. Да и параметры я уже не передаю - проще сразу в запрос прописать условия.