Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Обращение в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.041 c
2-1132933237
DelphiLexx
2005-11-25 18:40
2005.12.11
Наследование форм - выдается ошибка


2-1133069841
Separator
2005-11-27 08:37
2005.12.11
Проблема с move


3-1130397012
solenko
2005-10-27 11:10
2005.12.11
Русский язык в 16-ти разрядном InterBase


2-1132565333
Express
2005-11-21 12:28
2005.12.11
UpCase


9-1121556269
Conferno
2005-07-17 03:24
2005.12.11
GL Blur (GLScene)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский