Вниз
Скачать: CL | DM;

Обращение в SQL запросе не по имени поля   Найти похожие ветки 

← →
carmen ©   (2005-10-26 11:03) [0]

Получилось так, что нужно работать з базой данных на Paradox, но программа написана на Turbo Pascal 7 под DOS. Вся проблема в том, что названия полей имеют имена написанные русскими символами. И если смотреть эту базу по Windows то на экране в названии полей и в данных одны иероглифы. Вопрос в следующем: если какаято возможность написать SQL запрос так чтобы в Select указывать не названия поля, а його номер. Сейчас я выхожу з полежения тем, что посторонней программой перекодирую базу в Win-кодировку. Но такой вариант на машине клиента не допустим.
Select d."ЗНАЧЕНИЕ"
from d_long d
where d."ЛИЦЕВОЙ СЧЕТ"=:schet and d."КОД ФАКТОРА"=:factor

Возможно ли више приведенный запрос записать без имен полей?

Заранее благодарен


← →
Lexer ©   (2005-10-26 11:10) [1]

>И если смотреть эту базу по Windows....
это как?

или меняй в своей программе выводимые названия полей, или делай так:
Select d."ЗНАЧЕНИЕ" Znachenie
from d_long d
where d."ЛИЦЕВОЙ СЧЕТ"=:schet and d."КОД ФАКТОРА"=:factor


← →
Johnmen ©   (2005-10-26 11:10) [2]

Увы и ах...


← →
Desdechado ©   (2005-10-26 11:13) [3]

2 Lexer
Проблема, как я понял, в другом - в том, что в программе нужно обратиться по именам, которые представляют собой кракозябры.
Имхо, выход - перекодировать заголовки, а еще лучше назвать латиницей.
Другого не вижу.


← →
Fay ©   (2005-10-26 11:14) [4]

2 Lexer ©   (26.10.05 11:10) [1]
>> >И если смотреть эту базу по Windows....
>> это как?
Это значит "по самые Windows", т.е. взглянуть глубого и внимательно.


← →
Anatoly Podgoretsky ©   (2005-10-26 11:18) [5]

carmen ©   (26.10.05 11:03)  
нельзя, в where должны быть точные названия полей.


← →
AdLeR   (2005-10-26 12:43) [6]

как в Парадок я не знаю, но в Oracle можно использовать макросы ()

Select d.&field1
from d_long d
where d.&field2=:schet and d.&field2 = :factor

работа с макросама анологична, работе с параметрами


← →
Sergey13 ©   (2005-10-26 12:47) [7]

2[6] AdLeR  
Это вроде не в Оракле, а в некоторых БД-шных библиотеках. Например в RX такое можно вроде.


← →
AdLeR   (2005-10-26 12:54) [8]

проще всего скачай библиотеку в которой релизована такая функциональность.


← →
sCORpio80 ©   (2005-10-26 13:02) [9]

проще всего скопировть таблицу и поменять названия полей


← →
Курдль ©   (2005-10-26 13:06) [10]


> sCORpio80 ©   (26.10.05 13:02) [9]
>
> проще всего скопировть таблицу и поменять названия полей


А зачем копировать? Просто alter TABLE_NAME ...
не проканает?


← →
carmen ©   (2005-10-26 15:50) [11]

В вопросе ж сказано, что перекодировка на машине клиента не допустима. Если я перекодирую тогда програма написанная под ДОС уже работать не будет.
Desdechado ©   (26.10.05 11:13) [3] понял правильно, но предложение не подходить.
Если еще какието варианты


← →
Sergey13 ©   (2005-10-26 15:58) [12]

2 [11] carmen ©   (26.10.05 15:50)
>Если еще какието варианты
Писать свою прогу теми-же средствами, что и прежняя.


← →
Desdechado ©   (2005-10-26 16:25) [13]

> Есть ли еще какие-то варианты
Есть. Имхо, самый правильный в этих условиях и радикальный - поменять исходную программу под DOS для работы с латинскими именами полей. Если нет исходников - прямо в EXE в именах полей заменить на равноценные им латинские.
Или написать заново, чтоб не по ДОС и с расшиенной функциональностью :)


← →
ANB ©   (2005-10-26 17:07) [14]

Удалено модератором
Примечание: Личная переписка


← →
sniknik ©   (2005-10-26 17:20) [15]

Удалено модератором
Примечание: Личная переписка


← →
Lexer ©   (2005-10-26 17:23) [16]

Удалено модератором
Примечание: Личная переписка


← →
sniknik ©   (2005-10-26 20:45) [17]

получил. нормальная таблица... если конечно закрыть глаза на имена полей на русском.
"неправильност" в том, что в заголовке таблицы прописан языковой драйвер ansii, а кодировка используется досовская oem, впрочем старые досовские проги на это внимания не обращали никогда (кто тогда вообще думал что будет куча кодировок/кодовых страниц и т.д? ;)

в общем, что надо сделать, надо исправить заголовок. можно руками, но не советую ;). на старую прогу это повлиять не должно (раз уж она не обращает внимания на кодировку в заголовке сейчас то какая ей будет разница что там изменено?)  исправить надо с ansii на cyrr. можно использовать вот эту процедуру (немного переделаный пример с хелпа)

uses  .... BDE {или DbiTypes равнозначны}, ....;

//эта лежит в датамодуле, можно сделать самостоятельную, не привязана ни к чему
procedure TDatMod.ChangeLangDriver(DatabaseName, TableName, LDName: string);
var
 TblExt: string;
 Database: TDatabase;
 TblDesc: CRTblDesc;
 OptDesc: FLDDesc;
 OptData: array [0..250] of Char;
 Cur: hDBICur;
 Rec: CFGDesc;
begin
 if (TableName="") or (LDName="") then raise Exception.Create("Unknown TableName or LDName");
 Database:= Session.OpenDatabase(DatabaseName);
 try
   if Database.IsSQLBased then raise Exception.Create("Function ChangeLangDriver working only with dBase or Paradox tables");
   FillChar(OptDesc, SizeOf(OptDesc), #0);
   FillChar(TblDesc, SizeOf(TblDesc), #0);
   StrCopy(OptDesc.szName, "LANGDRIVER");
   OptDesc.iLen:=Length(LDName)+1;
   with TblDesc do begin
     StrPCopy(szTblName, TableName);
     TblExt:=UpperCase(ExtractFileExt(TableName));
     if TblExt=".DBF" then StrCopy(szTblType, szDbase)
     else if TblExt=".DB" then StrCopy(szTblType, szParadox)
     else begin
       AnsiToOEM(StrPCopy(OptData, DatabaseName), OptData);
       if DbiOpenCfgInfoList(nil, dbiREADONLY, cfgPersistent, StrPCopy(OptData, "\DATABASES\"+StrPas(OptData)+"\DB INFO\"),Cur)<>DBIERR_NONE
         then raise Exception.Create("Unknown table type");
       try
         while DbiGetNextRecord(Cur, dbiNOLOCK, @Rec, nil)<>DBIERR_EOF do
           if StrComp(Rec.szNodeName, "DEFAULT DRIVER")=0 then begin
             StrCopy(szTblType, Rec.szValue);
             Break;
           end;
       finally
         Check(DbiCloseCursor(Cur));
       end;
     end;
     iOptParams:=1;
     pfldOptParams:=@OptDesc;
     pOptData:=@OptData;
   end;
   StrPCopy(OptData, LDName);
   Check(DbiDoRestructure(Database.Handle, 1, @TblDesc, nil,nil, nil, False));
 finally
   Session.CloseDatabase(Database);
 end;
end;


вызов (таблица дожна быть закрыта везде! нужен монопольный доступ)
DatMod.ChangeLangDriver("путь к таблице", "имя таблици", "cyrr");

однократный вызов этого для всех таблиц исправит заголовки (досовского варианта) и позволит работать как тебе в винде так и твоей устаревшей программе (если конечно она не использует монопольный доступ).


← →
carmen ©   (2005-10-26 22:07) [18]

Спасибо за вариант.
Но это я делал (но по другому) и так приведено выше, после этих изменений прога под ДОСом перестает работать, вылетая с ошибкой связаной с базой.


← →
sniknik ©   (2005-10-26 22:25) [19]

> вылетая с ошибкой связаной с базой.
тогда это изза другой ошибки, какой кстати? "связаной с базой" нет такой ошибки.
по предложенному варианту изменяется 4 символа в заголовке таблици и все... символы на которые исходная прога внимания не обращает (иначе бы писала в другой кодировке)
кроме 1 раза этих изменений (при закрытых прогах, и твоей и старой, и BDE и любой другой) больше таблици трогать не надо, вот если трогать при работе другой программы то тогда точно гарантировано получиш "ошибку связаную с базой".



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.029 c
14-1132226125
dr Tr0jan
2005-11-17 14:15
2005.12.11
Кто помнит Basic?


3-1130156501
Сержо
2005-10-24 16:21
2005.12.11
Некорректное отображение дат


3-1130435799
BigSerg
2005-10-27 21:56
2005.12.11
Unicode+Ado+Oracle


2-1132404304
начиннающий
2005-11-19 15:45
2005.12.11
Filter


14-1132564096
stone
2005-11-21 12:08
2005.12.11
Долой кактусы, даешь пирамиды :))




   Наверх