powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Визуальное дублирование записей
4 сообщений из 4, страница 1 из 1
Визуальное дублирование записей
    #36329920
PavelVX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/topic/708618
Сорри, но на этом форуме не получается отослать приватные сообщения :(
Assa, не могли бы вы прокомментировать данный феномен? Или может кто сталкивался с такой проблемой в связке.
Он проявился при переходе с MS SQL на PostgreSQL.
...
Рейтинг: 0 / 0
Визуальное дублирование записей
    #36330560
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavelVX/topic/708618
Сорри, но на этом форуме не получается отослать приватные сообщения :(
Assa, не могли бы вы прокомментировать данный феномен? Или может кто сталкивался с такой проблемой в связке.
Он проявился при переходе с MS SQL на PostgreSQL.гм. тут "смешались в кучу кони/люди/". Т.е. у вас 3 источника , 3 составных части - ПЖ/ODBC/Access. причём Access также в 2-х лицах 1. - Jet (вы к линкованным таблицам ходите, а не к "запросам к серверу" и, судя по всему , совершенно не к ADO/DAO Recordset-ам открытым напярмую к серверу), и 2. - собственно его формы.

первым делом имеет смысл , мне кажется, включить логгирование ODBC (покопайтесь в настройках DSN - где-то там это есть). Ну и после действия, вызвавшего "проблему" в ближайшем событии попытайтесь отрефрешить данные (внимательно посмотрите на лог ОДБС - сдается мне, что он у вас будет посылать запрос без ключа, а "ключевым набором" будет полный, !неуникальный! набор остальных полей, [ну, и возможно, будет как-то пытаться заполучить пресловутый identity , которого в пж, в отличии от скл нет, в пж есть сериалы на сиквенсах]).

Одним из грубых хаков я бы предложил умолчательное поле_на_форме (умолчательное значение генерируется формой, а не в таблице). чтобы уже при добавлении записи со стороны аксесса, в неё вставлялся, скажем штамп времени или иное "почти уникальное", и аксесс. таким образом, не пытался бы отождествить записи на основе неуникального набора.

какой-то грубый хак был связан с тем, что я запрашивал напрямую nextval(\'\',\'\') _до_вставки_, и присваивал его "руками" (формой), иногда даже в спрятанное поле. Сейчас попробую вспомнить.
...
Рейтинг: 0 / 0
Визуальное дублирование записей
    #36330658
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
Function get_pg_nextval(fieldName As String, tabName As String) As Long
Dim sSQL  As String, nxt As Long
    sSQL = "SELECT f_get_sequence('" & tabName & "','" & fieldName & "')"
    nxt = OpenPgSQL(sSQL).Fields( 0 )
    get_pg_nextval = nxt
End Function
где

Код: plaintext
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.
Function OpenPgSQL(strSQL As String, Optional lODBCTimeout As Long =  60 , _
    Optional tType As Long = dbOpenForwardOnly) As DAO.Recordset
On Error GoTo err_OpenPgSQL

Dim conP As DAO.Connection
Dim qdfTemp As DAO.QueryDef
    
    'Debug.Print strSQL
    'logPrint strSQL
        
    Set conP = ODBCcon 'wrkODBC.OpenConnection("", dbDriverComplete, , fstrODBC())
    
    Set qdfTemp = conP.CreateQueryDef("")
    With qdfTemp
        .ODBCTimeout = lODBCTimeout
        .Prepare = dbQUnprepare
        .sql = strSQL
        
        Set OpenPgSQL = .OpenRecordset(tType)
    End With
    
    
ex_OpenPgSQL:
On Error Resume Next
    
    Set conP = Nothing

    Exit Function
err_OpenPgSQL:

    logPrint err.Description & ";" & fErr_discription()
    Set OpenPgSQL = Nothing
    Resume ex_OpenPgSQL
End Function
где,
...ну и так далее...
(можно все упростить, а не отсылаться к ранее определенным ф-ям/св-вам/пр-рам
например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Property Get ODBCcon(Optional ReCalc As Boolean) As DAO.Connection
'Dim wrkODBC As DAO.Workspace
    If ReCalc Then Set vODBCcon = Nothing
    If vODBCcon Is Nothing Then
        Set wrkODBC = CreateWorkspace("NewODBCWorkspace", "nobody", "", dbUseODBC)
        Set vODBCcon = wrkODBC.OpenConnection("", dbDriverNoPrompt, , fstrODBC())
    End If
    Set ODBCcon = vODBCcon
End Property
т.е. если у вас есть какая-то ф-я, возвращающая nextval в поле формы, как дефолтное значение поля_формы до собственно вставки записи - то вот уже и хорошо.

А как вы ее напишете - через ДАО, через АДО, еще как - дело ваше.

PS аналогов _мС-Скл-ного_ timestamp-а в пж нет, сделать руками можно, но ведь главное - объяснить аксессу, что это именно такой специальный "хак" (чисто майкрософтовская договоренность). А как это сделать - я не знаю (кажется можно завести на сервере специально именуемую табличку для таких "договорных" дел, или еще что-то... простите мой склероз - MSDN вам в руки)

ЗЫ2 и попробуйте (с включенным логом ОДБС) покрутить настройки ОДБС драйвера при подсоединении таблиц. Может "само пройдёт" (наверняка проблема известная, и пимпочки в настройках драйвера под это дело заточены).
...
Рейтинг: 0 / 0
Визуальное дублирование записей
    #36330712
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ах, да, забыл еще серверную часть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE FUNCTION f_get_sequence(_tabname text, _fieldname text)
  RETURNS integer AS
$BODY$
declare
	_sql text;
	_row RECORD;
	_res int4;
begin
 _sql := 'SELECT nextval(
	pg_get_serial_sequence('|| quote_literal(_tabname) || ',' || quote_literal(_fieldname)|| ')::text
		
	) as f 
	;';

	EXECUTE _sql INTO _row;
 	_res := _row.f;
	RETURN _res;
end
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST  100 ;
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Визуальное дублирование записей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]