Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: 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 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




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


2-1132619516
Дева
2005-11-22 03:31
2005.12.11
об Access


2-1132743597
Василий927
2005-11-23 13:59
2005.12.11
OnActivate/OnDeactivate не работают?


2-1132914479
psa247
2005-11-25 13:27
2005.12.11
Create Process !


14-1132144432
dr Tr0jan
2005-11-16 15:33
2005.12.11
Глюк в Multisim (EWB)