Страница 18 из 19

Re: Прямой SQL

Добавлено: 14 фев 2016, 13:26
Kolsey Zhenya
insert into pick(wlist, crec)
select 1, #comp(1) from DUAL
union all select 1, #comp(2) from DUAL
union all select 1, #comp(23) from DUAL;
в версии Atlantis 5.5.24 реализована поддержка Dual. :cool:

Re: Прямой SQL

Добавлено: 02 сен 2016, 07:34
Алексей
В саппорте в dsql пишу три запроса, в которых используюется одинаковая константа.
Можно как то объявить переменную типа declare @ts = 'text' и потом уже использовать @ts в этих трёх запросах?

Re: Прямой SQL

Добавлено: 02 сен 2016, 09:02
RAJAH
В таких случаях пишу запрос не в Суппорте, а на SQL Server.

Re: Прямой SQL

Добавлено: 08 сен 2016, 14:23
edward_K
1. #define w visage i.e.
2.
#declare name (список параметров)
...
#end
3. Если на випе то можно руками собрать любое выражение по критериям

Re: Прямой SQL

Добавлено: 08 сен 2016, 17:53
Алексей
саппорт проглотит дефайны или диклэар? Запрос в модуле SQL саппорта пишется.

Re: Прямой SQL

Добавлено: 10 сен 2016, 09:17
edward_K
Support да, в обычных запросах использую постоянно. На dsql правда не юзал, но какая разница?

Re: Прямой SQL

Добавлено: 13 окт 2016, 11:25
RAJAH
Как на DSQL написать конструкцию типа

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

dbo.toatldate(convert(datetime, substring(t$katparty.f$name, 1, 10), 103))
?
Функция

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

#date(cast(substring(katparty.name, 1, 2) as word), ...
ругается на cast: "Ожидалось целое число".

Re: Прямой SQL

Добавлено: 13 окт 2016, 12:04
edward_K
судя по всему у вас в наименовании уже сидит дата.
Вопрос собственно в чем - а зачем преобразовывать в дату? да еще и через word?
Date2Str вот есть. Если нужно прям в запросе что то сравнивать, то можно наоборот дату привести в строку с маской YYYYMMDD и сравнивать с вашим полем. Ну или попробовать Cast|convert сразу в date. В сапорте тренируйтесь. #date все таки для констант, а не для полей.

Re: Прямой SQL

Добавлено: 13 окт 2016, 12:26
RAJAH
edward_K писал(а):зачем преобразовывать в дату?
Для сравнения, вестимо.
edward_K писал(а):попробовать Cast сразу в date
Ошибка преобразования значения varchar "01/10/2006" в тип данных int
edward_K писал(а):дату привести в строку с маской YYYYMMDD и сравнивать
Вот это хорошая идея!

Re: Прямой SQL

Добавлено: 13 окт 2016, 12:33
zna
Если сравнить параметр типа даты с полем типа даты, так без преобразования можно:

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

var dbeg, dend: date;
...  
SQLAddStr(strHandle, ' where basedoc.ddoc >= ? and basedoc.ddoc <= ?');
  sqlPrepare(stmt, strHandle);
  sqlBindParam(stmt, 1, dbeg);
  sqlBindParam(stmt, 2, dend);

Re: Прямой SQL

Добавлено: 13 окт 2016, 12:49
edward_K
возможно ваше число не в том формате. Можно попробовать привести к нужному заменив / на чего нибудь.
Вам бы CONVERT с 3 параметром = 103, но он в доке не прописан - так что в ТП. А пока приведите к строке.

Re: Прямой SQL

Добавлено: 13 окт 2016, 13:04
savov
Народ, а вот относительно FRM
Я сделал временную таблицу
...

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

         stmt := sqlAllocStmt;
         sqlDropTmpTable('tbOracleData');
         sqlAddStr(StmtString, 'table tbOracleData');
	 sqlAddStr(StmtString, '(');
	 sqlAddStr(StmtString, ' tNsap: String,');
	 sqlAddStr(StmtString, ' tviddv: String,');
	 sqlAddStr(StmtString, ' tzavod: string,');
	 sqlAddStr(StmtString, ' tsklad: String,');
	 sqlAddStr(StmtString, ' tparty: String,');
	 sqlAddStr(StmtString, ' tKsap: String,');
	 sqlAddStr(StmtString, ' tbarkod: String,');
	 sqlAddStr(StmtString, ' td56: String,');
	 sqlAddStr(StmtString, ' ted: String,');
	 sqlAddStr(StmtString, ' tkol: double');
	 sqlAddStr(StmtString, ');');
	 sqlCreateTmpTable(StmtString, ctmDynamicIndex);
	 sqlFreeStmt(stmt);
Это срабатывает, таблицу в Oracle в своей схеме вижу.
Далее пробую залить в нее данные

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

                    Message(TVMain.tmain.tNsap+' '+TVMain.tmain.tviddv+' '+TVMain.tmain.tzavod,0); // данные есть
         stmt := sqlAllocStmt;
         sqlAddStr(StmtString, 'INSERT INTO tbOracleData');
         sqlAddStr(StmtString, '(');
         sqlAddStr(StmtString, '  tNsap, tviddv, tzavod, tsklad, tparty, tksap, tbarkod, td56, ted, tkol');
         sqlAddStr(StmtString, ')');
         sqlAddStr(StmtString, 'VALUES');
         sqlAddStr(StmtString, '(');
         sqlAddStr(StmtString, ''''+ TVMain.tmain.tNsap + ''',');
         sqlAddStr(StmtString, ''''+ TVMain.tmain.tviddv + ''',');
         sqlAddStr(StmtString, ''''+ TVMain.tmain.tzavod + ''',');
         sqlAddStr(StmtString, ''''+ TVMain.tmain.tsklad + ''',');
         sqlAddStr(StmtString, ''''+ TVMain.tmain.tparty + ''',');
         sqlAddStr(StmtString, ''''+ TVMain.tmain.tksap+ ''',');
         sqlAddStr(StmtString, ''''+ TVMain.tmain.tbarkod+ ''',');
         sqlAddStr(StmtString, ''''+ TVMain.tmain.td56+ ''',');
         sqlAddStr(StmtString, ''''+ TVMain.tmain.ted+ ''',');
         sqlAddStr(StmtString, ''''+ TVMain.tmain.tkol+ '''');
         sqlAddStr(StmtString, ')');
            sqlPrepare ( stmt, StmtString );   // текущий вариант
         Message( sqlExecute ( stmt ),0);    // возвращает 0

//         sqlExecDirect(StmtString);  пробовал и так
         sqlFreeStmt(stmt);
а вот этот код уже не заливает данные в таблицу. В чем может быть загвоздка? Еще раз напомню, делаю это в FRM.

Re: Прямой SQL

Добавлено: 13 окт 2016, 13:30
RAJAH
savov
Похоже, дело вот в этих последовательностях: ''''

Re: Прямой SQL

Добавлено: 13 окт 2016, 13:37
Den
RAJAH писал(а):Как на DSQL написать конструкцию типа

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

dbo.toatldate(convert(datetime, substring(t$katparty.f$name, 1, 10), 103))
?
Функция

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

#date(cast(substring(katparty.name, 1, 2) as word), ...
ругается на cast: "Ожидалось целое число".

Поизвращаться можно попробовать и без строкового преобразования

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

sql
 select name
          from KATPARTY
       inner join
        (
          select dsopr from katsopr where nsopr='11441122'  // накладнуха такая именно от 14/10/2010 выписана , если перебить дату накладной например 15/10/2010 то в результат ничего не вернеться
        )t1 on Cast(Substring(KATPARTY.name,1,2) as integer)+Cast(Substring(KATPARTY.name,4,2) as integer)*256+Cast(Substring(KATPARTY.name,7,4) as integer)*65536=t1.dsopr
     where name='14/10/2010qwerty'
;



Re: Прямой SQL

Добавлено: 13 окт 2016, 13:56
savov
RAJAH писал(а):savov
Похоже, дело вот в этих последовательностях: ''''
Rajan, не совсем понял мысль...
вот так в vip все прекрасно

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

         sqlAddStr(StmtString, 'INSERT INTO tblSalesNotaAuk');
         sqlAddStr(StmtString, '(');
         sqlAddStr(StmtString, '  knrec, datob, name, summa, NSklad, invero, country, rpl, vozvrat');
         sqlAddStr(StmtString, ')');
         sqlAddStr(StmtString, 'VALUES');
         sqlAddStr(StmtString, '(');
         sqlAddStr(StmtString, ''''+ String(tblSalesNotaAuk.knrec) + ''',');
         sqlAddStr(StmtString, ''''+ GetDateAsPascalLongint(tblSalesNotaAuk.datob) + ''',');
         sqlAddStr(StmtString, ''''+ tblSalesNotaAuk.name + ''',');
         sqlAddStr(StmtString, ''''+ tblSalesNotaAuk.sum + ''',');
         sqlAddStr(StmtString, ''''+ String(tblSalesNotaAuk.nSklad) + ''',');
         sqlAddStr(StmtString, ''''+ tblSalesNotaAuk.invero + ''',');
         sqlAddStr(StmtString, ''''+ tblSalesNotaAuk.country + ''',');
         sqlAddStr(StmtString, ''''+ tblSalesNotaAuk.rpl + ''',');
         sqlAddStr(StmtString, ''''+ tblSalesNotaAuk.vozvrat + '''');
         sqlAddStr(StmtString, ')');   
Синтаксис такой же, да и ошибок в ORA73DRV нет