0 / 0 / 1
Регистрация: 17.03.2012
Сообщений: 188
1

После добавления поля lookup в dataset, "access violation" при скроле

09.02.2017, 23:48. Показов 1578. Ответов 7

Author24 — интернет-сервис помощи студентам
Доброе время суток форумчане,
Такой вопрос:
Есть БД (FireBird), Есть простое приложение (без кода) только с dataset1 – master, dataset2-detail, привязанный к двум таблицам.

Запрос в DataSet1:
SQL
1
SELECT * FROM TABLE1
Запрос в DataSet2:
SQL
1
SELECT t2.* FROM  TABLE2 t2 WHERE t2.ID_NAME_FROM_TABLE1 = :ID
Работает замечательно. Данные корректно отображаются в обеих dataset.

Добавил в dataset2, новое поле «name», типа lookup (см. рис. внизу), для отображения в нем содержимого поля «name» из dataset1.

При скролинге DBGrid (dataset1), ошибка:
«Access violation at address 004CC6F0 in module 'Meta.exe'. Read of address 00000014»


С помощью функции "UseDebug DCUs" ("Options - Compiler"), во время этой ошибки меня выкидывает в модуль "...delphi7\source\vcl\IBCustomDataSet.pas" на строку №1847 (на "function TIBCustomDataSet.IsVisible(Buffer: PChar): Boolean;")

Ошибки в программе нет, если данные (ВСЕ строки) dataset1, вмещаются в DBGrid (за один просмотр)

Заранее спасибо.
Миниатюры
После добавления поля lookup в dataset, "access violation" при скроле  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2017, 23:48
Ответы с готовыми решениями:

После добавления формы возникла ошибка 'access violation'
После добавления формы возникла ошибка 'access violation'. unit Unit1; interface uses ...

Добавления нового поля в таблицу БД Access, не могу разместить после первого поля
Собстевнно столкнулся с проблемой размещения поля в таблице. Данная проблема в MySQL решается в...

При вызове поля класса выдает ошибку Project1.exe raised exception class EAccesViolation with message 'Access violation
Здравствуйте. Уже не знаю к кому обратиться. Никак не могу понять, почему выдает вышеуказанную...

GenerateDBDirect после добавления колонки в существующую таблицу в DataSet
Имеем отношение cards в dataset, которая заполняется из таблицы dbcards в бд и имеет связи с...

ADO DataSet Lookup
Добрый день. Задача, как я понимаю, тривиальная, но я уже что-то второй день чехлюсь и ничего...

7
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,248
10.02.2017, 02:30 2
Не хило было бы увидеть сам проект целиком.
Иначе вопрос выглядит как малохудожественный свист.
0
5775 / 4519 / 1429
Регистрация: 14.04.2014
Сообщений: 20,140
Записей в блоге: 20
10.02.2017, 07:45 3
если я правильно понял
по переходу на новую запись Dataset1 отбирается группа записей Dataset2
а одно из полей Dataset2 пытается делать lookup по Dataset1, т.е. бегает по записям Dataset1, что приводит к тому, что
по переходу на новую запись Dataset1 отбирается группа записей Dataset2
и одно из полей Dataset2 пытается делать lookup по Dataset1, т.е. бегает по записям Dataset1, что приводит к тому, что...
продолжать до просветления
1
0 / 0 / 1
Регистрация: 17.03.2012
Сообщений: 188
10.02.2017, 15:00  [ТС] 4
Цитата Сообщение от northener Посмотреть сообщение
Не хило было бы увидеть сам проект целиком.
Иначе вопрос выглядит как малохудожественный свист.
Да вообщем и показывать то нечего в плане кода (стандартный код компонентов с двумя запросами и связью):
вот, пожалуйста:
Unit1.pas
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, IBCustomDataSet, IBDatabase, Grids, DBGrids;
 
type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    IBDataSet1: TIBDataSet;
    IBDataSet2: TIBDataSet;
    DataSource2: TDataSource;
    IBTransaction1: TIBTransaction;
    IBDatabase1: TIBDatabase;
    IBDataSet1NAME: TIBStringField;
    IBDataSet1ID: TIntegerField;
    IBDataSet2ID_NAME_FROM_TABLE1: TIntegerField;
    IBDataSet2ID: TIntegerField;
    IBDataSet2NAME: TStringField;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
end.
Unit1.dfm
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
object Form1: TForm1
  Left = 263
  Top = 392
  Width = 1016
  Height = 468
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object DBGrid1: TDBGrid
    Left = 16
    Top = 32
    Width = 225
    Height = 145
    DataSource = DataSource1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
  end
  object TDBGrid
    Left = 472
    Top = 144
    Width = 320
    Height = 120
    DataSource = DataSource2
    TabOrder = 1
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    Columns = <
      item
        Expanded = False
        FieldName = 'ID_NAME_FROM_TABLE1'
        Visible = True
      end
      item
        Expanded = False
        FieldName = 'ID'
        Visible = True
      end
      item
        Expanded = False
        FieldName = 'NAME'
        Visible = True
      end>
  end
  object DataSource1: TDataSource
    DataSet = IBDataSet1
    Left = 208
    Top = 176
  end
  object IBDataSet1: TIBDataSet
    Database = IBDatabase1
    Transaction = IBTransaction1
    DeleteSQL.Strings = (
      'delete from TABLE1'
      'where'
      '  ID = :OLD_ID')
    InsertSQL.Strings = (
      'insert into TABLE1'
      '  (ID, NAME)'
      'values'
      '  (:ID, :NAME)')
    RefreshSQL.Strings = (
      'Select '
      '  NAME,'
      '  ID'
      'from TABLE1 '
      'where'
      '  ID = :ID')
    SelectSQL.Strings = (
      'select * from TABLE1')
    ModifySQL.Strings = (
      'update TABLE1'
      'set'
      '  ID = :ID,'
      '  NAME = :NAME'
      'where'
      '  ID = :OLD_ID')
    Active = True
    Left = 136
    Top = 208
    object IBDataSet1NAME: TIBStringField
      FieldName = 'NAME'
      Origin = '"TABLE1"."NAME"'
      Size = 10
    end
    object IBDataSet1ID: TIntegerField
      FieldName = 'ID'
      Origin = '"TABLE1"."ID"'
      ProviderFlags = [pfInUpdate, pfInWhere, pfInKey]
      Required = True
    end
  end
  object IBDataSet2: TIBDataSet
    Database = IBDatabase1
    Transaction = IBTransaction1
    DeleteSQL.Strings = (
      'delete from TABLE2'
      'where'
      '  ID = :OLD_ID')
    InsertSQL.Strings = (
      'insert into TABLE2'
      '  (ID, ID_NAME_FROM_TABLE1)'
      'values'
      '  (:ID, :ID_NAME_FROM_TABLE1)')
    RefreshSQL.Strings = (
      'Select '
      '  ID_NAME_FROM_TABLE1,'
      '  ID'
      'from TABLE2 '
      'where'
      '  ID = :ID')
    SelectSQL.Strings = (
      'select t2.* from  TABLE2 t2 where t2.ID_NAME_FROM_TABLE1 = :ID'
      ''
      '')
    ModifySQL.Strings = (
      'update TABLE2'
      'set'
      '  ID = :ID,'
      '  ID_NAME_FROM_TABLE1 = :ID_NAME_FROM_TABLE1'
      'where'
      '  ID = :OLD_ID')
    DataSource = DataSource1
    Left = 584
    Top = 208
    object IBDataSet2ID_NAME_FROM_TABLE1: TIntegerField
      FieldName = 'ID_NAME_FROM_TABLE1'
      Origin = '"TABLE2"."ID_NAME_FROM_TABLE1"'
    end
    object IBDataSet2ID: TIntegerField
      FieldName = 'ID'
      Origin = '"TABLE2"."ID"'
      ProviderFlags = [pfInUpdate, pfInWhere, pfInKey]
      Required = True
    end
    object IBDataSet2NAME: TStringField
      FieldKind = fkLookup
      FieldName = 'NAME'
      LookupDataSet = IBDataSet1
      LookupKeyFields = 'ID'
      LookupResultField = 'NAME'
      KeyFields = 'ID_NAME_FROM_TABLE1'
      Lookup = True
    end
  end
  object DataSource2: TDataSource
    DataSet = IBDataSet2
    Left = 656
    Top = 208
  end
  object IBTransaction1: TIBTransaction
    Active = True
    DefaultDatabase = IBDatabase1
    Left = 216
    Top = 64
  end
  object IBDatabase1: TIBDatabase
    Connected = True
    DatabaseName = 'D:\Prog\_Example\DB_TEST.GDB'
    Params.Strings = (
      'user_name=sysdba'
      'password=masterkey'
      'lc_ctype=WIN1251')
    LoginPrompt = False
    Left = 72
    Top = 88
  end
end
Project1.dpr
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
program Project1;
 
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.res}
 
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Добавлено через 6 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
и одно из полей Dataset2 пытается делать lookup по Dataset1, т.е. бегает по записям Dataset1, что приводит к тому, что...
продолжать до просветления
т.е. вы намекаете на замкнутый цикл?...
0
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
10.02.2017, 15:41 5
Цитата Сообщение от Kostantin-78 Посмотреть сообщение
т.е. вы намекаете на замкнутый цикл?...
Скорее намек на то, что для лукап полей нужно создавать свои датасеты (подойдет IBTable или IBQuery), а не использовать уже задействованные, которые живут своей жизнью.
1
0 / 0 / 1
Регистрация: 17.03.2012
Сообщений: 188
11.02.2017, 16:56  [ТС] 6
Цитата Сообщение от Скандербег Посмотреть сообщение
Скорее намек на то, что для лукап полей нужно создавать свои датасеты (подойдет IBTable или IBQuery), а не использовать уже задействованные, которые живут своей жизнью.
А как это будет вылядеть?
Т.е. 2 dataset (master-detail) у меня останется, а IBQuery, каким образом для lookup задействую?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.02.2017, 18:49 7
Цитата Сообщение от Kostantin-78 Посмотреть сообщение
а IBQuery, каким образом для lookup задействую?
это должен быть третий, не совпадающий ни с IBDataSet1, ни IBDataSet2 набор данных, а будет это IBQuery1 или IBDataSet3 - без разницы. И именно его использовать для look-up поля

Добавлено через 6 минут
И вообще, для начала TABLE1 и TABLE2 надо сначала переименовать по именам сущностей. А если это действительно, просто ТАБЛИЦЫ, то лучше к Excel перейти, именно это программа из линейки MSO для этого предназначена. Зачем БД?
1
0 / 0 / 1
Регистрация: 17.03.2012
Сообщений: 188
11.02.2017, 19:42  [ТС] 8
Цитата Сообщение от YuryK Посмотреть сообщение
И вообще, для начала TABLE1 и TABLE2 надо сначала переименовать по именам сущностей
Это я знаю, это только для примера
0
11.02.2017, 19:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2017, 19:42
Помогаю со студенческими работами здесь

Access Violation после некоторого времени
Есть небольшой алгоритм человечка-патрульного. Он ходит по экрану. Может: стоять, поворачиваться,...

После сборки в Release краш с Access Violation
Имеется Dll, собранная в Release /MT. На Win8 все прекрасно работает, а на 7ке крашится с...

После выхода из процедуры сортировки Access violation
Доброго времени суток, жители КиберФорума! Надеюсь на вашу помощь. Мне нужно срочно реализовать...

Сразу после компиляции вываливается access violation
В общем ситуация такая: компиляция при стандартных настройках проходит без проблем, все работает и...

Access Violation после изменения размера формы в дизайне
Доброго дня! Первая компиляция программы и запуск проходит отлично. Если немного изменить размер...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru