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

Проблема при использовании DSQL

Добавлено: 21 дек 2016, 17:12
Irina_
Здравствуйте. Никогда раньше не использовала DSQL, но сейчас такая необходимость появилась. Столкнулась с проблемой, не могу понять причину. Ниже кусок исходника.

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

Var sumK, Ob51 : Double;
       stmt, stmSQL : Longint;
       schD : String;     

Table Struct tmpOborot
(
  Scheto : String,
  Sumob1   : Double
)
With index
(
  ind01 = Scheto)
;
…
  stmt:= sqlAllocStmt;
  sqlAddStr( stmSQL, 'Select dBScheto As Scheto, sum(Sumob) As Sumob1');  // нужен кор.счет  без кода ПС
  sqlAddStr( stmSQL, ' From Oborot Where' );
  sqlAddStr( stmSQL, ' Datob>=' + String( DateToInt_(DatBeg)) );
  sqlAddStr( stmSQL, ' and Datob<=' + String( DateToInt_(DatEnd)) );
  sqlAddStr( stmSQL, ' and Schetk=' + sch_ + ' and Subschk=' + ssch_ + ' and Kauks[2']=#comp(' + String( cOrg ) + ')');
  sqlAddStr( stmSQL, ' group by dBScheto' );

  sumK:= 0;
  Ob51:= 0;
  v1.Delete all TmpOborot;
  If sqlExecStmt( stmt, stmSQL ) = tsOk 
    {
      If sqlFetchInto( stmt, #v1.TmpOborot ) = tsOk   
        {
           v1._Loop TmpOborot
             {
               sumK:= sumK + v1.TmpOborot.Sumob1;
               schD:= v1.TmpOborot.Scheto;
               If schD = '51' or schD = '52'
                 Ob51:= Ob51 + v1.TmpOborot.Sumob1;

LogStrToFile( FileProt, 'schD=' + schD + ', v1.TmpOborot.Sumob1=' + String( v1.TmpOborot.Sumob1) );
             }
        }
      Else
        {
          LogStrToFile( FileProt, 'sqlFetchInto: fail');
        }
    }
  Else
    {
      LogStrToFile( FileProt, 'sqlExecStmt: fail');
    }

  sqlFreeStr( stmSQL );
  sqlFreeStmt( stmt );  
Проблема: таблица TmpOborot заполняется, вижу по протоколу, но v1.TmpOborot.Sumob1 всегда равно 0. Что я сделала не так?

Re: Проблема при использовании DSQL

Добавлено: 21 дек 2016, 18:23
edward_K
1. Очень рекомендую, чтобы таблица во вью была не первая.
2. Ранее еще было обязательно as select .., tmpoborot.*
3. как то странно видеть #v1.TmpOborot. мож так и можно, но мне привычней v1.tnTmpOborot
и попробуйте все таки заполнить в основной вьюхе
4. для фильтров по датам рекомендуется использовать DateToStr( DT ,'#date(DD,MM,YYYY)' ) ну или в других варивциях - это есть в vipprogr.chm
5. Одно поле в отборе SQL не хватает, но здесь 2.
6. Испытайте запрос в сапорте - SQL select ...

Re: Проблема при использовании DSQL

Добавлено: 22 дек 2016, 00:07
Den
навскидку, рабочий код у вас.
Видимо, какие то нюансы в vip вашем, которых тут не видно. А вью лучше правда неименованые использовать.

Re: Проблема при использовании DSQL

Добавлено: 22 дек 2016, 12:19
Irina_
Здравствуйте. Большое спасибо отозвавшимся.
1, 2 - Так и есть, свои таблицы всегда ставлю во view после галактических
3. Так встречала в примерах в vipprogr.chm. Тем более с выводом v1.TmpOborot.Scheto проблем нет.
4. Ф-цию DateToInt_ взяла на форуме. При замене на приведенную Вами в Dsql.log выдалась синтаксическая ошибка, похоже на DateToStr( DT ,'#date(DD,MM,YYYY)' ). Поэтому вернула то, что было изначально в условии на дату.
6. Ввела в Support
sql select dbscheto as scheto, sum(sumob) as sumob1 from oborot where schetk='760' and subschk='10' and datob>=#date(01,03,2016) and datob <=#date(31,03,2016) and kauks[2]=#comp(0002000000000BEEh) group by dbscheto;
Результат правильный, суммы выводятся ненулевые. Т.о. проблема появляется скорее всего при считывании полученной по запросу выборки в таблицу в памяти.
Потом пришла мысль, что вместо sqlFetchInto надо использовать sqlFetchIntoByName, чтобы связывание было по именам, т.к. таблица tmpOborot реально имеет больший перечень полей, чем привела я, и указанные поля в описании таблицы стоят не рядом. Однако и это не помогло (((. Имена в описании таблицы и в цикле точно совпадают, специально копировала из описания таблицы.

Re: Проблема при использовании DSQL

Добавлено: 22 дек 2016, 12:56
Den
Ну я и говорю что "первосданый" код не виден ваш и поэтому трудно догадаться где лажает.
накидал ваш пример у себя. Все работает. В смысле суммы вывело. Там просто нечему не работать )

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

InterFace TestDsql123;


Table Struct tmpOborot
(
  Scheto : String,
  Sumob1   : Double
)
With index
(
  ind01 = Scheto)
;
 create view v1
   Var sumK, Ob51 : Double;
        stmt, stmSQL : Longint;
       schD,FileProt,sch_,ssch_ : String;     
       cOrg : comp;
       DatBeg,datEnd : date

  as select * from tmpOborot
 ;

 HandleEvent
  Cminit:{


  FileProt:='c:\debug\dsqltest.log';
  sch_:='360' ;
  ssch_:='01' ;
   corg:= 123456789;
  datbeg:=date(01,01,2010);
  datend:=date(31,12,2010);

  stmt:= sqlAllocStmt;
  sqlAddStr( stmSQL, 'Select dBScheto As Scheto, sum(Sumob) As Sumob1');  // нужен кор.счет  без кода ПС
  sqlAddStr( stmSQL, ' From Oborot Where' );
  sqlAddStr( stmSQL, ' Datob>=' + String( DateToInt_(DatBeg)) );
  sqlAddStr( stmSQL, ' and Datob<=' + String( DateToInt_(DatEnd)) );
  sqlAddStr( stmSQL, ' and Schetk=' + sch_ + ' and Subschk=' + ssch_ + ' and Kauks[1]=#comp(' + String( cOrg ) + ')'); // у меня орг-и на кау №1
  sqlAddStr( stmSQL, ' group by dBScheto' );

  sumK:= 0;
  Ob51:= 0;
  Delete all from TmpOborot;
  If sqlExecStmt( stmt, stmSQL ) = tsOk
    {
      If sqlFetchInto( stmt,#v1.TmpOborot ) = tsOk   
        {
           _Loop TmpOborot
             {
!               sumK:= sumK + v1.TmpOborot.Sumob1;
!               schD:= v1.TmpOborot.Scheto;
!               If schD = '51' or schD = '52'
!                 Ob51:= Ob51 + v1.TmpOborot.Sumob1;

                LogStrToFile( FileProt, 'TmpOborot.Sumob1=' + String(TmpOborot.Sumob1) );
             }
        }
      Else
        {
          LogStrToFile( FileProt, 'sqlFetchInto: fail');
        }
    }
  Else
    {
      LogStrToFile( FileProt, 'sqlExecStmt: fail');
    }

  sqlFreeStr( stmSQL );
  sqlFreeStmt( stmt );  
 }
 end;
end.

Re: Проблема при использовании DSQL

Добавлено: 22 дек 2016, 15:55
Irina_
Наконец удалось решить проблему, но сейчас я в замешательстве. Выше я писала, что изменила метод sqlFetchInto на sqlFetchIntoByName, но это не помогло. Потом в описании таблицы в памяти, в которой, как я уже писала, полей больше, чем 2, которые я пыталась заполнить, я изменила порядок полей, а именно: нужные мне 2 поля я поставила первыми. И сумма после этого стала заполняться! Скажу сразу, что указанную таблицу в памяти я использую в разных целях, поэтому и полей там больше. И я не могла подумать, что порядок описания полей в таблице является причиной моей проблемы. Еще раз внимательно перечитала описание методов sqlFetchInto и sqlFetchIntoByName. По 1-ому действительно написано, что связывание идет по порядку, а по 2-му написано, что по имени, насчет порядка там не сказано. Тогда у меня возникают вопросы: почему при связывании по имени сумма не заполнилась (имена ведь совпадают!) и чем же тогда отличаются эти методы?

Re: Проблема при использовании DSQL

Добавлено: 22 дек 2016, 16:03
Irina_
Денис, Вы правильно заметили, что может быть проблема в моем полном исходнике. Он большой, не хотелось его приводить полностью, поэтому привела только на мой взгляд необходимое. При этом удалила из описания таблицы лишние поля. Кто же мог подумать, что они играют свою роль вместе со стандартными методами.

Re: Проблема при использовании DSQL

Добавлено: 22 дек 2016, 16:05
Den
Я регил ПИР летом по похожему поводу. Поправили в 5,5,26 (LOTDLL__DLL_55260) Может вы пробуете все это не с последними патчами.
* ПРОБЛЕМА В ПИР: 180.9649
* ПЕРВОЕ РЕШЕНИЕ: NEW
* КРАТКОЕ ОПИСАНИЕ: Ошибка в запросе dsql из vip
* ПРОЕКТ: Инструментарий прикладного программиста
* ДЕТАЛИЗАЦИЯ: Прямой SQL
# ЧТО ИЗМЕНЕНО:

DSQL

----- ПРОЯВЛЕНИЕ ПРОБЛЕМЫ -----
Неправильно сопоставляет колонки функция sqlFetchIntoByName
Фактически она работает также как просто sqlFetchInto

Re: Проблема при использовании DSQL

Добавлено: 22 дек 2016, 16:14
Irina_
У нас стоит Lot_dll_55250. Патчи ставлю не я. На базу последний раз ставились в конце 09.2016, а на Support в начале 09.2016. Т.е. решение проблемы по Вашему запросу мне пока не доступно.

Re: Проблема при использовании DSQL

Добавлено: 22 дек 2016, 16:18
Den
Значит нужно ставить патчи )
или юзать sqlSelectIntoByName (в ней подобной ошибки, насколько помню, не было)