Прямой SQL

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

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

Kolsey Zhenya
Сообщения: 13
Зарегистрирован: 20 мар 2013, 17:41

Re: Прямой SQL

Сообщение 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:
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Прямой SQL

Сообщение Алексей »

В саппорте в dsql пишу три запроса, в которых используюется одинаковая константа.
Можно как то объявить переменную типа declare @ts = 'text' и потом уже использовать @ts в этих трёх запросах?
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

В таких случаях пишу запрос не в Суппорте, а на SQL Server.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Прямой SQL

Сообщение edward_K »

1. #define w visage i.e.
2.
#declare name (список параметров)
...
#end
3. Если на випе то можно руками собрать любое выражение по критериям
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Прямой SQL

Сообщение Алексей »

саппорт проглотит дефайны или диклэар? Запрос в модуле SQL саппорта пишется.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Прямой SQL

Сообщение edward_K »

Support да, в обычных запросах использую постоянно. На dsql правда не юзал, но какая разница?
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

Как на DSQL написать конструкцию типа

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

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

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

#date(cast(substring(katparty.name, 1, 2) as word), ...
ругается на cast: "Ожидалось целое число".
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Прямой SQL

Сообщение edward_K »

судя по всему у вас в наименовании уже сидит дата.
Вопрос собственно в чем - а зачем преобразовывать в дату? да еще и через word?
Date2Str вот есть. Если нужно прям в запросе что то сравнивать, то можно наоборот дату привести в строку с маской YYYYMMDD и сравнивать с вашим полем. Ну или попробовать Cast|convert сразу в date. В сапорте тренируйтесь. #date все таки для констант, а не для полей.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

edward_K писал(а):зачем преобразовывать в дату?
Для сравнения, вестимо.
edward_K писал(а):попробовать Cast сразу в date
Ошибка преобразования значения varchar "01/10/2006" в тип данных int
edward_K писал(а):дату привести в строку с маской YYYYMMDD и сравнивать
Вот это хорошая идея!
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Прямой SQL

Сообщение zna »

Если сравнить параметр типа даты с полем типа даты, так без преобразования можно:

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

var dbeg, dend: date;
...  
SQLAddStr(strHandle, ' where basedoc.ddoc >= ? and basedoc.ddoc <= ?');
  sqlPrepare(stmt, strHandle);
  sqlBindParam(stmt, 1, dbeg);
  sqlBindParam(stmt, 2, dend);
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Прямой SQL

Сообщение edward_K »

возможно ваше число не в том формате. Можно попробовать привести к нужному заменив / на чего нибудь.
Вам бы CONVERT с 3 параметром = 103, но он в доке не прописан - так что в ТП. А пока приведите к строке.
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение 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.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

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

Re: Прямой SQL

Сообщение 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'
;


savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение 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 нет
Ответить