Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
8 / 8 / 1
Регистрация: 18.04.2010
Сообщений: 74

Выборка из таблицы

17.10.2010, 15:37. Показов 1873. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем есть таблицы RazuzBezRs, H06090, SH01007, в них есть строковое поле DSE.
Необходимо просмотреть все записи поля DSE в RazuzBeRS и проверять выполнение условия, что текущая запись также содержится в таблицах H06090 и SH01007 в поле DSE. Если условие выполняется, то добавить в таблицу prom из таблицы H06090(из поля DSE) все повторяющиеся записи (равные текущей записи найденной в RazuzBezRs).
Работаю с компонентами Table, query, datasource. Пробовал делать через запрос (код приведен ниже), цикл до конца не доходит( останавливается на какой-то записи) и программа просто виснет.
Может подскажете еще какие-нибудь способы как можно сделать эту задачу, или что может быть не так с моим кодом?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
procedure TForm1.Button1Click(Sender: TObject);
var i,ii,y,yy,j,jj:integer;
                dse:string;
begin
 with dm do
begin
 
  tb_RazuzBezRs.First;
  for yy:=0 to tb_RazuzBezRs.RecordCount-1 do
  Begin  //DSE iz RazuzBezRS    next
    dse:=tb_RazuzBezRsDSE.AsString;
 
    if (tb_H06090.Locate('DSE', dse, []) and // проверка условий
     tb_SH01007.Locate('DSE', dse, [])) then
   begin
 
     tb_prom.First; // Очистка таблицы tb_prom
    for i:=0 to tb_prom.RecordCount-1 do
    begin
    tb_prom.Delete;
    tb_prom.Next;
    end;
   
      query1.Close;
      query1.Sql.clear;
      query1.Sql.add('select DSE, Z from H06090 where DSE = '+ dse);
      query1.Open;
     
    while not dm.Query1.Eof do
    begin
     dm.tb_prom.Insert;
     dm.tb_promDSE.AsString:=dm.Query1.Fields[0].AsString;
     dm.tb_promZ.AsFloat:=dm.Query1.Fields[1].AsFloat;
     dm.tb_prom.Post;
     dm.Query1.Next;
    end;
  
  
   end;// locate
  tb_RazuzBezRs.Next;
  End;
end; // dm
  
  showmessage('!');
  dm.tb_prom.Active:=true;
end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.10.2010, 15:37
Ответы с готовыми решениями:

Выборка таблицы по условию если ничего не найдено, вернуть все записи таблицы!
Добрый день! забыл как сделать выборку, есть такой запрос: select * FROM Applications WHERE Id = 1000 Этот запрос ничего не...

Выборка значения из таблицы по переменной из другой таблицы
<?php $result_rw = mysql_query("SELECT achive_id FROM users_achive WHERE user_id = '$id'", $ServerLink); $achive_id = $row; ...

Выборка из таблицы и обновление второй таблицы
Подскажите пожалуйста , как можно сделать такое: Есть 2 таблицы, table1(code, pol1,pol2,pol3,pol4,pol5) и table2(code,...

11
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
17.10.2010, 16:25
Для того, чтобы что-то посоветовать надо знать
1. В таблицах RazuzBezRs и SH01007 поле DSE заполняется уникальными значениями, или значения могут повторяться?
2. Какую СУБД используешь?
0
8 / 8 / 1
Регистрация: 18.04.2010
Сообщений: 74
17.10.2010, 22:42  [ТС]
1. В таблицах RazuzBezRs и SH01007 значения поля DSE уникальны.
2. Использую dBASE lV
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
18.10.2010, 06:17
Я бы сделал следующее.
1. В объектt Query1 прописал бы запрос
SQL
1
2
3
SELECT H.* FROM H06090 H
WHERE (EXISTS(SELECT 1 FROM RazuzBezRs R WHERE R.DSE = H.DSE))AND
  (EXISTS(SELECT 1 FROM SH01007 S WHERE S.DSE = H.DSE))
2. При этом фрагмент кода вставки записей
Delphi
1
2
3
4
5
6
7
8
dm.Query1.Open;
while not Query1.Eof do begin
  dm.tb_prom.Insert;
  dm.tb_promDSE.AsString:=dm.Query1.Fields[0].AsString;
  dm.tb_promZ.AsFloat:=dm.Query1.Fields[1].AsFloat;
  dm.tb_prom.Post;
  dm.Quert1.Next;
end;
Все это должно сработать, если dbase 4 соответствует стандартам SQL. Я с файлами dbf лет 20 не работал и всегда удивляюсь тому факту, что еще находятся люди, использующие этот реликт
1
8 / 8 / 1
Регистрация: 18.04.2010
Сообщений: 74
18.10.2010, 10:14  [ТС]
SAMZ, сделал как вы советовали.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
procedure TForm1.Button1Click(Sender: TObject);
var i,ii,y,yy,j,jj:integer;
                dse:string;
begin
count:='';
 with dm do
begin
 
  tb_RazuzBezRs.First;
  for yy:=0 to tb_RazuzBezRs.RecordCount-1 do
  Begin  //DSE iz RazuzBezRS    next
    dse:=tb_RazuzBezRsDSE.AsString;
    count:=count+' '+dse;
 
    if (tb_H06090.Locate('DSE', dse, []) and
     tb_SH01007.Locate('DSE', dse, [])) then
     begin
 
     tb_prom.First; // Очистка таблицы tb_prom
    for i:=0 to tb_prom.RecordCount-1 do
    begin
    tb_prom.Delete;
    tb_prom.Next;
    end;
 
  query1.Close;
  query1.SQL.Clear;
  query1.SQL.Add('SELECT * FROM H06090 H');
  query1.SQL.Add('WHERE (EXISTS(SELECT DSE FROM RazuzBezRs R WHERE R.DSE = H.DSE))AND');
  query1.SQL.Add('(EXISTS(SELECT DSE FROM SH01007 S WHERE S.DSE = H.DSE))');
  query1.Open;
 
    while not Query1.Eof do
    begin
     tb_prom.Insert;
     tb_promDSE.AsString:=Query1.FieldByName('DSE').AsString; 
     tb_promZ.AsFloat:=Query1.FieldByName('Z').AsFloat; 
     tb_prom.Post;
     Query1.Next;
    end;
 
   end;// locate
  tb_RazuzBezRs.Next;
  End;
end; // dm
  
  showmessage('!');
 
  dm.tb_prom.Active:=true;
end;
Цикл останавливается на строке query1.Open;, дальше виснет.

Пробовал также сделать без запросов, используя промежуточную таблицу prom06090 и фильтруя ее по DSE. Результат тот же, программа виснет Код с фильтрацией ниже.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
procedure TForm1.Button1Click(Sender: TObject);
var i,ii,y,yy,j,jj:integer;
                dse:string;
begin
 with dm do
begin
 
  tb_RazuzBezRs.First;
  for yy:=0 to tb_RazuzBezRs.RecordCount-1 do
  Begin  //DSE iz RazuzBezRS    next
    dse:=tb_RazuzBezRsDSE.AsString;
 
    tb_prom06090.First; // Очистка таблицы tb_prom06090
    for j:=0 to tb_prom06090.RecordCount-1 do begin
    tb_prom06090.Delete;
    //tb_prom06090.Next;
    end;
 
    tb_H06090.First;                          // промежуточная табл заполняется 
    for ii:=0 to dm.tb_H06090.RecordCount-1 do
    begin
    tb_prom06090.Insert;
    tb_prom06090DSE.AsString:=tb_H06090DSE.AsString;
    tb_prom06090Z.AsFloat:=tb_H06090Z.AsFloat;
    tb_prom06090.Post;
    tb_H06090.Next;
    end;
 
    if tb_H06090.Locate('DSE', dse, []) and   // проверка условия
     tb_SH01007.Locate('DSE', dse, []) then
   begin
 
     tb_prom.First; // Очистка таблицы tb_prom
    for i:=0 to tb_prom.RecordCount-1 do begin
    tb_prom.Delete;
    tb_prom.Next;
    end;
 
          tb_prom06090.SetRangeStart;                        // фильтрация по DSE
          tb_prom06090.FieldByName('dse').AsString:=dse;
          tb_prom06090.SetRangeEnd;
          tb_prom06090.FieldbyName('dse').AsString:=dse;
          tb_prom06090.ApplyRange;
               
           tb_prom06090.First;
         while not tb_prom06090.Eof do begin
           tb_prom.Insert;
           tb_promDSE.AsString:=tb_prom06090DSE.AsString;
           tb_promZ.AsFloat:=tb_prom06090Z.AsFloat;
           tb_prom.Post;
           tb_prom06090.Next;
         end;
 
   end;// locate
  tb_RazuzBezRs.Next;
  End;
end; // dm
  
  showmessage('!');
  
  dm.tb_prom.Active:=true;
end;
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
18.10.2010, 10:35
Цикл
Delphi
1
for yy:=0 to tb_RazuzBezRs.RecordCount-1 do
здесь представляется лишним. Но причина остановки на query1.Open не в этом. Если у Вас есть какие - либо интерактивнае средства работы с БД вашего формата, попробуйте запучтить этот запрос с поиощью этих средств
0
8 / 8 / 1
Регистрация: 18.04.2010
Сообщений: 74
18.10.2010, 15:10  [ТС]
Есть стандартный SQL Explorer, в нем этот запрос также не работает (SQL explorer виснет). Экспериментировал со своим запросом
Delphi
1
2
3
4
query1.Close;
      query1.Sql.clear;
      query1.Sql.add('select DSE, Z from H06090 where DSE = '+ dse);
      query1.Open;
В результате на некоторых записях программа просто виснет, хотя "эти" записи ничем не отличаются от остальных.

Если делать через фильтрацию и не вводить промежуточную таблицу, то как потом вернуть таблицу в исходное состояние до фильтрации? Пробовал закрывать и открывать таблицу, не помогает.
Delphi
1
2
3
4
5
6
7
8
          tb_H06090.close;
          tb_H06090.open;
          
          tb_H06090.SetRangeStart;                        // фильтрация по DSE
          tb_H06090.FieldByName('dse').AsString:=dse;
          tb_H06090.SetRangeEnd;
          tb_H06090.FieldbyName('dse').AsString:=dse;
          tb_H06090.ApplyRange;
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
18.10.2010, 15:18
А таблица H06090 в SQL Explorer открывается. Попробуй открыть ее без SQL и полистать. Может таблица битая?
0
8 / 8 / 1
Регистрация: 18.04.2010
Сообщений: 74
19.10.2010, 08:47  [ТС]
Открыл H06090, полистал немного, вроде все нормально (всю не пролистаешь, там больше 10000 записей). Причем интересный факт: в таблице H06090 в поле DSE точно есть запись 1889300590001,
а когда я в SQL Explorer пишу запрос
SQL
1
SELECT * FROM H06090 WHERE DSE='1889300590001'
он (SQL Explorer) просто виснет. Пробовал также некоторые другие значения поля DSE - работает нормально.

Добавлено через 16 часов 29 минут
Неужели нет способа решить эту задачу без SQL?

 Комментарий модератора 
SQL именно для того и придумывали, чтобы решать подобные задачи. Надо иметь в виду, что BDE и SQL Explorer - это инстренты, которые давно никем не сопровождаются. Формат dbf это тоже раннее утро позавчерашнего дня. С чем Вы там столкнулись сказать сложно. Могут быть битые файлы или битые индексы. А ругать SQL или пытаться обойти его - это уподобляться известной мартышке, ругающей очки


Добавлено через 37 минут
В моем случае решить задачу с помощью SQL не получается из-за "битых файлов или индексов или записей", поэтому я и ищу другие способы. И да, dbf это старье согласен, но эта БД была написана задолго до меня и приходится работать с тем что есть.
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
19.10.2010, 09:05
Цитата Сообщение от aimk0 Посмотреть сообщение
В моем случае решить задачу с помощью SQL не получается из-за "битых файлов или индексов или записей", поэтому я и ищу другие способы. И да, dbf это старье согласен, но эта БД была написана задолго до меня и приходится работать с тем что есть.
Понятно!
Сочувствую. Один совет. В инете можно найти описание структуры dbf-файла. Эти файлы состоят из так называемого хидера (заголовочной части), в котором описываются некоторые общие для таблицы данные (количество имена, типы и размер полей, количество записей и т.д.). Насколько я помню хидер в этих файлах всегда имеет один и тот же размер. Так вот, можно открыть этот файл, как обычный файл прямого доступа. С помощью Seek встать на нужный байт и далее считывать записи одну за другой интерпретировать их и выполнять необходимые действия.
1
 Аватар для Sergiuz
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
19.10.2010, 09:14
В моем случае решить задачу с помощью SQL не получается из-за "битых файлов или индексов или записей", поэтому я и ищу другие способы. И да, dbf это старье согласен, но эта БД была написана задолго до меня и приходится работать с тем что есть.
Для проверки найди в инете программы которрые могут переиндексировать тебе dbf-ник. Если мне не изменяет память это также можно сделать и в BDE, поищи

Не по теме:

10 000 записей а уникальное поле 13 значное - это жесть для dbf и для меня



Попробуй использовать в SQL значение First, поищи справку как им пользоваться, можна выбирать n-первых записей и если на каком нить n у тебя будет ошибка таки файл битый, в таком случай и тейбл не поможет
1
8 / 8 / 1
Регистрация: 18.04.2010
Сообщений: 74
19.10.2010, 11:14  [ТС]
Спасибо за помощь, буду думать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.10.2010, 11:14
Помогаю со студенческими работами здесь

Выборка из таблицы и обновление второй таблицы
Подскажите пожалуйста , как можно сделать такое: Есть 2 таблицы, tab1(id, pol1,pol2,pol3,pol4,pol5) и tab2(id, pol1,pol2,pol3,pol4,pol5),...

Выборка из таблицы
Добрый день! Прошу вашей помощи или подсказки форумчане. Смотрите ситуация следующая: Например есть таблица учет , в таблице скаже...

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

Выборка из таблицы
Приветствую, возможно я задаю глупый вопрос, но после часа поисков, не смог найти ответ. Есть табличка ...

Выборка из таблицы
Есть програма и БД+WCF, пользователь входит в програму логин и пароль, далее если нажымает информация о пользователе должна выводитса инф...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru