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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Irina_
Местный житель
Сообщения: 547
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

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

Сообщение 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. Что я сделала не так?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение 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 ...
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение Den »

навскидку, рабочий код у вас.
Видимо, какие то нюансы в vip вашем, которых тут не видно. А вью лучше правда неименованые использовать.
Irina_
Местный житель
Сообщения: 547
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

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

Сообщение 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 реально имеет больший перечень полей, чем привела я, и указанные поля в описании таблицы стоят не рядом. Однако и это не помогло (((. Имена в описании таблицы и в цикле точно совпадают, специально копировала из описания таблицы.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение 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.
Irina_
Местный житель
Сообщения: 547
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

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

Сообщение Irina_ »

Наконец удалось решить проблему, но сейчас я в замешательстве. Выше я писала, что изменила метод sqlFetchInto на sqlFetchIntoByName, но это не помогло. Потом в описании таблицы в памяти, в которой, как я уже писала, полей больше, чем 2, которые я пыталась заполнить, я изменила порядок полей, а именно: нужные мне 2 поля я поставила первыми. И сумма после этого стала заполняться! Скажу сразу, что указанную таблицу в памяти я использую в разных целях, поэтому и полей там больше. И я не могла подумать, что порядок описания полей в таблице является причиной моей проблемы. Еще раз внимательно перечитала описание методов sqlFetchInto и sqlFetchIntoByName. По 1-ому действительно написано, что связывание идет по порядку, а по 2-му написано, что по имени, насчет порядка там не сказано. Тогда у меня возникают вопросы: почему при связывании по имени сумма не заполнилась (имена ведь совпадают!) и чем же тогда отличаются эти методы?
Irina_
Местный житель
Сообщения: 547
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

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

Сообщение Irina_ »

Денис, Вы правильно заметили, что может быть проблема в моем полном исходнике. Он большой, не хотелось его приводить полностью, поэтому привела только на мой взгляд необходимое. При этом удалила из описания таблицы лишние поля. Кто же мог подумать, что они играют свою роль вместе со стандартными методами.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение Den »

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

DSQL

----- ПРОЯВЛЕНИЕ ПРОБЛЕМЫ -----
Неправильно сопоставляет колонки функция sqlFetchIntoByName
Фактически она работает также как просто sqlFetchInto
Irina_
Местный житель
Сообщения: 547
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

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

Сообщение Irina_ »

У нас стоит Lot_dll_55250. Патчи ставлю не я. На базу последний раз ставились в конце 09.2016, а на Support в начале 09.2016. Т.е. решение проблемы по Вашему запросу мне пока не доступно.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение Den »

Значит нужно ставить патчи )
или юзать sqlSelectIntoByName (в ней подобной ошибки, насколько помню, не было)
Ответить