Знатоки ADO, как отсортировать таблицу ? (физически) #293763


#0 by smaharbA
Как можно отсортировать таблицу через АДО, волнует именно "физическая" сортировка данных ?
#1 by Кроки
когда-то работал с MS SQL и Oracle. Совет с тех времен, - через индексный файл. ADOCommand->Text="CREATE INDEX .. и далее".
#2 by smaharbA
читай сабж внимательно
#3 by Sedoy
"физически" - это только переписать в новую таблицу...
#4 by Кроки
Читаю. Конкретизируй "физически". Ты подразумеваешь, что хочешь положить записи в таблицу одна за другой согласно условию сортировки?
#5 by DGorgoN
+1
#6 by Кроки
ADOCommand->Text="INSERT INTO Новая_Таблица SELECT * FROM Старая_Таблица WHERE (условие отбора)". более конкретная запись зависит от синтаксиса конкретной SQL
#7 by smaharbA
согласен Но... незабывайте про примарикей, запись "физически" будет всеравно сделана по нему и в порядке возрастания... Таблица такова, что запись в нее могу делать только при присутствии примарикея (парадокс), структуру менять немогу...
#8 by masky
>будет всеравно сделана по нему и в порядке возрастания при всем уважении - это бред делаешь первичный ключ кластерным - это физическое переупорядочивание записей.
#9 by Кроки
Тогда не SELECT *, а SELECT (поле2, поле 3,...) и INSERT модифицируется, когда будешь перечислять поля.. вроде INSERT INTO Новая_Таблица SET Новая_Таблица.Поле2=Старая_Таблица.Поле2 Т.е., перетаскиваешь без PRIMARY_KEY (если твоя БД спроектирована, что PRIMARY KEY не несет другой функциональной нагрузки кроме как id записи. А в новой таблице тебе уже создастся свой PrKey.
#10 by smaharbA
попробуй для таблиц парадокс... суть еще в том, что надо попутно поменять одну запись, поле которое участвует в примарикее
#11 by masky
так. рассказывай подробнее. а то нифига непонятно
#12 by smaharbA
есть таблица парадокса, без индексов и соответственно примарикея через ADOX создаю новую, чтобы заменить как советовали , создаю с primarykey по имеющемуся полу, поле в исходной в части записей имеет значение Null, соответственно для уникальности, нахожу минимум примерно так call rec.open("select * from " & db & " order by Numeric",con ,3,3) rec.movefirst min = rec.fields.item("Numeric").value if isnull(min) then min=0 ... далее заполняю из имеющихся записей (последовательно, не запросом) и если Null то подставляю min-- результирующая таблица заполняется от минимума к максимуму, независимо от указания SortOrder можно конечно, создать еще одну и выполнить типа Но хотелось бы в одной... ....
#13 by masky
в таких таблицах невозможно именно физически упорядочить записи
#14 by Кроки
Весело. Везде же рекомендуют на PRIMARYKEY бросать unique_id, который уже никогда не изменяется (хмыкнул). А под прикладные нужды используются просто индексы. Но это ладно. Давай немного теории. PRIMARYKEY как правило используется для ссылок на строку (уник.ид строки таблицы). Если ты в SELECT задаешь условие отбора (сортировки), твой PRIMARYKEY используется для упорядочения записей в тех случах... вообщем, когда его нет в условии, он не используется. Если есть подходящий индекс, то используется он. Если нет ничего подходящего, БД медленно но верно перебирает всю таблицу строка за строкой. При этом, ты можешь выбирать в SELECT и PRIMARY_KEY и записывать его в другую таблицу наравне с другими строками (главное, чтобы тип совпадал). Есть сложность в разных реализациях SQL. Но это примерно правильно в общем случае.
#15 by smaharbA
Сделай с парадоксовской таблицей... ... Еще разок, суть - нужно сменить одно поле в записи, в таблице без примарикея, потому сразу стал делать еще в пятницу )) создав промежуточную таблицу, могу конечно ее сразу переписать как в исходную, но какбы вообще без промежуточной ?
#16 by masky
>Еще разок, суть Блин абрахамс, не придуривайся. расскажи что те сделать надо и чем те ALTER TABLE неканает
#17 by Кроки
модифицируй. я смотрю if isnull(min) then min=0 ты делаешь на старой таблице UPDATE Таблица SET min=0 WHERE min=NULL; INSERT INTO .... SELECT... ORDER BY(выражение);
#18 by smaharbA
еще разок - таблица парадокса, не выйдет так сделать апдейт, нужен обязательно примарикей, таковы уж особености работы адо с парадоксом... примарикей не добавить к имеющейся таблицы, проверено...
#19 by Кроки
. Если с исходной... просто UPDATE Таблица SET min=0 WHERE min Is NULL; смысла нет физически упорядочивать таблицу (как правило). Думаешь, какие запросы будут идти к таблице и создаешь просто индексы, а потом их и юзаешь. Если у таблицы будут дочерние, создавай PRIMARY_KEY аутоинк'ом (новое поле), чтобы на свою таблицу ссылаться по этому самому полю.
#20 by smaharbA
+ потому и нахожу минимум и заполняю последовательно, те записи в которых нул они в конце таблицы (всегда), по возрастанию немогу, потому, что первая запись типа 987654321 следующая 876543210 а остальные нул (порядок должен остаться прежним)
#21 by masky
Для таблиц Paradox DataBase Desktop (из Дельфей) позволяет создавать и удалять любые индексы на любом этапе, включая первичный. Условие - поля для первичного индекса должны быть первыми в списке. а значит и  АДО может. но я незнаю как :(
#22 by smaharbA
если написал что есть смысл, то ненадо опроверкать... там старая прога которая читает записи по порядку и в зависимости от порядкового номера резолвит инфу, прогу менять немогу...
#23 by Кроки
Тогда INSERT в новую таблицу, где у тебя в структуре добавляется новое поле (оно же PRIMARY_KEY, оно же autoinc), а остальные поля те же самые. Сделаешь INSERT, старую таблицу удалишь, а новую переименуешь. А дальше как у тебя написано. movefirst и т.д.
#24 by smaharbA
это уже сдалано, делается через ADOX но загвоздка в промежуточной, если не смогу, то фих с ней, пущай будет промежуточная... просто думал, что в АДО есть метод типа sort (не параметр)
#25 by smaharbA
и новое поле немогу добавить, оно для примарикея в парадоксе обязательно первое, та прога так написана, что берет записи по порядку и поля по порядку (пофих ей на имена) :( уже опробовано, ладно наплевать, буду через промежуточную
#26 by Кроки
.. Гмык, старую лучше переименовать. А еще лучше, чтобы не ломать структуру: пишешь в новую, там меняешь min, из старой удаляешь все записи, и ложи туда в нужном тебе порядке.
#27 by Господин ПЖ
сделай клстерный индекс
#28 by smaharbA
не удалишь и не положишь... это Paradox, в старй нету первичного ключа, таковы уж особенности работы АДО с таблицами парадокса... уже писали, но всеже попробую, хотя непойму чем он поможет в такой долбанутой ситуации (со старой прогой)
#29 by smaharbA
Еще вопрос - возможноли с помощью АДО прочитать парадоксовскую запароленную таблицу ? Ну и записать обратно также, если возможно...
#30 by Андрюха
А зачем уважаемому рэбе сортировать таблицу физически?
#31 by smaharbA
а чтобы старая прога из нее записи читала как это было до вмешательства... уж так прога та устроена - Первая запись - даныые о томто Вторая - о семто.. Третья - о третьем... и т.д. (записей савсем мало 5 ) и поля читает не по именам, а по порядку
#32 by spock
UID = "admin", PWD = "jIGGAe"
#33 by smaharbA
подкорректируйте, может вогнать все в один запрос ? ...
#34 by smaharbA
парадоксовские таблицы, не доступ к базе, а зашифрованные по паролю таблицы
#35 by spock
+32 "Driver={Microsoft Paradox Driver (*.db )}; |UID=" + UID + "; |PWD=" + PWD + "; |DriverID=538; |Fil=Paradox 5.X; |DefaultDir=" + Каталог + "; |Dbq=" + Каталог + "; |CollatingSequence=ASCII;"
#36 by smaharbA
непоможет еще разок, не доступ к базе (че там доступто, он файлы) а запароленная таблица, нету там юзера, там идет шифрование на основе пароля... ... можешь попробовать, на запороленной таблице сам...
#37 by smaharbA
Еще чего можно услышать по ?
#38 by spock
т.е. не попробовал? зря...
#39 by spock
+38 именно с юзером и паролем из
#40 by ildus
необязательно, можно сделать и в текущей таблице перестановкой значений полей между записями (по принципу сортировки массива), но это долго
#41 by smaharbA
именно так пробовал как только начал парадоксовские таблицы зырить, не работает это, это несколько иное вот табличку могу кинуть
#42 by spock
Колонка: Numeric: [923777025] Колонка: String: [NYP] Колонка: Comment: [For DateTime/Who is owner] Колонка: Numeric: [884520961] Колонка: String: [NYP] Колонка: Comment: [Install DAte /Who install] Колонка: Numeric: [0] Колонка: String: [222-09-04] Колонка: Comment: [SecretCode;Support Phone] Колонка: Numeric: [0] Колонка: String: [10199.0001] Колонка: Comment: [Network path] Запрос к db (нач.): 17:19:06
#43 by smaharbA
это через АДО ? с именем и паролем ?
#44 by smaharbA
+ выдергивать то выдергиваю, меня через АДО интересовало
#45 by spock
мляя
#46 by smaharbA
колись по человечи, код выложи...
#47 by spock
//_____________________________________________________________________________ // Процедура Сформировать    Перем conn, rs, cmd;    Перем conStr;        conStr = "Driver={Microsoft Paradox Driver (*.db )};    |UID=admin;    |PWD=jIGGAe;    |DriverID=538;    |Fil=Paradox 5.X;    |DefaultDir=C:;    |Dbq=C:;    |CollatingSequence=ASCII;";        conn = CreateObject("ADODB.Connection");    conn.ConnectionTimeout     = 30;    conn.CursorLocation         = 3;    conn.ConnectionString     = conStr;    conn.Open;        rs     = CreateObject("ADODB.Recordset");    rs.ActiveConnection     = conn;    rs.CursorType         = 1;    rs.LockType             = 2;        cmd     = СоздатьОбъект("ADODB.Command");    cmd.ActiveConnection = conn;    cmd.CommandText         = "SELECT * FROM system1.db";    rs = Cmd.Execute;        Если rs.EOF = -1 Тогда    Иначе        rs.MoveFirst;        Пока rs.EOF = 0 Цикл            ТекЗнач = rs.Fields.Item.Value;                        // перебирай сам                        rs.MoveNext;        КонецЦикла;    КонецЕсли; КонецПроцедуры // Сформировать
#48 by smaharbA
--------------------------- Сервер сценариев Windows --------------------------- Сценарий:    C:SETCODATgetcodat.vbs Строка:    18 Символ:    4 Ошибка:    Невозможно найти устанавливаемый ISAM. Код:    80004005 Источник:    Microsoft JET Database Engine --------------------------- ОК   --------------------------- ... Какой устанавливать ? И откудова знания такого суперпупер пароля ? ))
#49 by spock
драйвер хоть и от MS, но он работать без BDE не будет. я понятия не имею для чего они дали возможность защищять базы данных паролем, если есть универсальный мастер-пароль :) чую, что на PGP должно быть что-то подобное :)
#50 by Aloex
Тоже стало интересно, яндекс на всё ответил, даже мистовскую ветку нашел.
#51 by Aloex
+
#52 by smaharbA
Вернее Результат ... --------------------------- Сервер сценариев Windows --------------------------- Символ:    1 Ошибка:    [Microsoft][Драйвер ODBC Paradox] Внешняя таблица не имеет предполагаемый формат. Код:    80004005 Источник:    Microsoft OLE DB Provider for ODBC Drivers --------------------------- ОК   ---------------------------
#53 by spock
драйвер (Microsoft Paradox Driver (*.db )) хоть и от MS, но он работать без BDE не будет.
#54 by smaharbA
работает, но только с незапароленными данными Ясно, спасибо spock за инфу про мастер пароль... ... вывод такой с запароленными таблицами через адо только при установленном бде ? это не канает, вернее не всегда подойдет к задаче... Всем спасибо...
#55 by spock
вывод не верный :)
#56 by smaharbA
скажи как верно... т.е. и без БДЕ будет ? тогда я ваще в ступоре... с незапароленными через адо работает, с запароленными см ... ниче не понимаю... :(
#57 by spock
conStr = "Provider=Microsoft.Jet.OLEDB.4.0; |Jet OLEDB:Database Password=""jIGGAe""; |Data Source=C:; |Extended Properties=Paradox 5.x;";
#58 by smaharbA
--------------------------- Сервер сценариев Windows --------------------------- Сценарий:    C:SETCODATgetcodat.vbs Строка:    26 Символ:    1 Ошибка:    Внешняя таблица не имеет предполагаемый формат. Код:    80004005 Источник:    Microsoft JET Database Engine --------------------------- ОК   --------------------------- либо для --------------------------- Сервер сценариев Windows --------------------------- Сценарий:    C:SETCODATgee.vbs Строка:    7 Символ:    1 Ошибка:    Ошибочный аргумент. Код:    80004005 Источник:    Microsoft JET Database Engine --------------------------- ОК   --------------------------- ... БДЕ отсутствует
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям