Search  
Friday, May 25, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Client/Server  "The refre...
 "The refresh key defined for table is not found."
 
 10/14/2010 6:35:15 PM
User is offlinevicos
139 posts
5th


"The refresh key defined for table is not found."
 (N/A)
Eroarea apare numai la INSERT.
Codul prin care Construiesc CursorAdapter:


*___________________________________________________________________________________________________
*
* Iesiri
*___________________________________________________________________________________________________
myCursorAdapter(;
[Iesiri],;
[SELECT * FROM Iesiri],;
GetConnectionString(.T.),;
[IdDoc], ;
[SELECT IdDoc FROM Iesiri WHERE IdDoc = @@IDENTITY])
SELECT Iesiri
PUBLIC ca_Iesiri As CursorAdapter
ca_Iesiri = GETCURSORADAPTER()
INDEX ON IdDoc TAG IdDoc
CURSORSETPROP("Buffering", 5, [Iesiri])
*___________________________________________________________________________________________________


* __________________________________________________________________________________________________________
FUNCTION myCursorAdapter (lcAlias, lcSelectCmd, lcConnectionString, lcInsertCmdRefreshFieldList, lcInsertCmdRefreshCmd, lnLockType)
IF TYPE([lnLockType]) = [L]
lnLockType = 3
ENDI

IF USED(lcAlias)
SELECT(lcAlias)
IF CURSORGETPROP("Buffering")>1
TABLEREVERT(.T.)
ENDIF
USE
ENDI

RELEASE loCursor
PUBLIC loCursor AS CURSORADAPTER

LOCAL loConn AS ADODB.CONNECTION, ;
loCommand AS ADODB.COMMAND, ;
loException AS EXCEPTION, ;
laErrors[5]

TRY
loConn = CREATEOBJECT('ADODB.Connection')
WITH loConn
TRY
.ConnectionString = lcConnectionString
.OPEN()
CATCH TO loException
For Each Error In loConn.Errors
? Error.Description,Error.Number
Next Error
MESSAGEBOX(loException.MESSAGE)
ENDTRY
ENDWITH
loCommand = CREATEOBJECT('ADODB.Command')
loCommand.ActiveConnection = loConn

loCursor = CREATEOBJECT('CursorAdapter')

WITH loCursor
.ALIAS = lcAlias
.DATASOURCETYPE = 'ADO'
.SELECTCMD = lcSelectCmd
*.FetchAsNeeded = .T. && Adaugat pe 4 Septembrie 2010 - pt lucru cu inregistrari multe cred ca nu e BUNA
FetchAsNeeded = .T.
FetchSize = 10
*.DATASOURCE = CREATEOBJECT('ADODB.Recordset')
.DATASOURCE = Newobject("ADODB.Recordset")
WITH .DATASOURCE
.ActiveConnection = loConn
.CursorLocation = 3 && adUseClient
.LockType = lnLockType && 3
.CursorType = 3 && adOpenStatic ( DEFAULT )
ENDWITH

.MAPBINARY = .T.
.MAPVARCHAR = .T.
.InsertCmdRefreshFieldList = lcInsertCmdRefreshFieldList
.InsertCmdRefreshCmd=lcInsertCmdRefreshCmd

* Adaugate 11 Octombrie 2010 - nu Merg!!!
*.InsertCmdDataSourceType=[ADO]
*.UpdateCmdDataSourceType = "ADO"
*.DeleteCmdDataSourceType = "ADO"
*
IF !.CURSORFILL(.F., .F., 0, loCommand)
AERROR(laErrors)
MESSAGEBOX(laErrors[2])
RETURN .F.

ELSE
*Allows edit and send updates to the backend.
LOCAL laFlds,lcStr,lnFldCount,i
DIMENSION laFlds[1]
lnFldCount=AFIELDS(laFlds)
lcStr=""
FOR i = 1 TO lnFldCount
*IF !INLIST(UPPER(laFlds[m.i,1]), [ID], [DATACREARII], [MODIFIEDDATE], [RV])
lcStr = lcStr + laFlds[m.i,1] + ","
*ENDI
ENDFOR
.UPDATABLEFIELDLIST = lcStr
* IF ATC([,RV], .UPDATABLEFIELDLIST )# 0
* .TimestampFieldList = [RV]
* .WhereType = 4
* ENDI

.ConflictCheckCmd =";IF @@ROWCOUNT=0 RAISERROR (' Update conflict.', 16, 1)"
ENDIF


ENDWITH
CATCH TO oException
* Replace with exception handling code here
MESSAGEBOX(oException.MESSAGE)

ENDTRY
RETURN .T.
ENDFUNC
* __________________________________________________________________________________________________________
 10/14/2010 8:38:13 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: "The refresh key defined for table is not found."
 (N/A)
Nu am vazut unde completezi proprietatea KeyFieldList a cursoradapter-ului.


Daniel Buduru
 10/14/2010 9:07:05 PM
User is offlinevicos
139 posts
5th


Re: "The refresh key defined for table is not found."
 (N/A)
O ignorasem complet!
Am modificat Procedura MyCursorAdapter si am pus KeyFieldList =[ID]( Id fiind cheie primara unica de tip INT AutoIncrementabila), dar EROAREA a ramas.
Deci nu era de la KeyFieldList!
 10/14/2010 9:38:05 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: "The refresh key defined for table is not found."
 (N/A)
Vezi InsertCmdRefreshKeyFieldList si UpdateCmdRefreshKeyFieldList. In ele ar trebui sa ia cheile primare pentru refresh dupa insert si update. Daca valoarea este empty, se ia valoarea din KeyFieldList.
Cheile specificate in KeyFieldList, ca si cele di proprietatile mentionate, trebuie sa se regaseasca in comanda select / update / insert respectiva.
Nu ai precizat cand anume apare eroarea, dar sursa ei este chiar cea din mesajul de eroare - cheia specificata in una din aceste proprietati nu se regaseste fie in comanda select, fie in tabela respectiva.
Verifica ce se gaseste in aceste proprietati cand apare eroarea. Se poate sa fi ajuns vreo valoare aiurea in una dintre ele.

BTW, in VFP performantele sunt mai bune pe o conexiune ODBC decat pe ADO. Daca ai si un driver ODBC, poti face un test comparativ.

Daniel Buduru
 10/14/2010 9:45:05 PM
User is offlinevicos
139 posts
5th


Re: "The refresh key defined for table is not found."
 (N/A)
Am uitat sa mentionez ca folosesc TRIGGERE pt insert, update si delete, in sensul ca inserez in niste tabele de audit ce inregistrari au fost sterse, modificate, adaugate.
Stiu ca la INSERT se incurca din cauza [SELECT ID FROM Iesiri WHERE ID = @@IDENTITY], dar nu stiu cum pot rezolva altfel CursorAdapter.InsertCmdRefreshCmd!!
Vreo idee?
Multumesc
 10/14/2010 10:37:26 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: "The refresh key defined for table is not found."
 (N/A)
Fara date concrete, nu pot sa-mi fac o idee. Triggerele nu afecteaza functionarea CA.
Nu functioneaza daca CA e lasat pe actualizare automata?


Daniel Buduru
 10/14/2010 11:19:33 PM
User is offlinevicos
139 posts
5th


Re: "The refresh key defined for table is not found."
 (N/A)
Daniel, este din cauza Triggerului INSERT, daca dezactivez triggerultotul e OK.
In Triggerul asta inserez in alta tabela de audit inregistrarea pe care am inserata in tabela iesiri. Acea tabela de audit avans si ea ID, cred ca in loc ca SELECT @@IDENTITY sa-mi intoarca IDul din tabela IESIRI ini intoarce IDul din tabela de audit si CAul intra in ceata pt. ca nu gaseste in tabela iesiri ID = @@IDENTITY.
Nu stiu cum sa folosesc SCOPE-IDENTITY(un ex. daca ai) sau o procedura stocata care sa imi inotarca IDul inregistrarii inserate in Iesiri.
Iata si Codul Triggerului pt. INSERT:

BEGIN
SET NOCOUNT ON
IF (EXISTS(SELECT * FROM INSERTED))
BEGIN
DECLARE @VAR_ID INT
DECLARE @NEW_MSSQLLM$0 NVARCHAR(38)
DECLARE @NEW_MSSQLLM$5 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$6 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$7 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$8 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$9 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$10 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$11 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$12 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$13 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$14 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$15 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$16 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$17 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$18 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$19 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$20 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$21 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$22 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$23 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$24 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$25 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$26 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$27 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$28 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$29 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$30 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$31 NVARCHAR(255)
DECLARE @NEW_MSSQLLM$32 NVARCHAR(255)
DECLARE LOG_CURSOR CURSOR FORWARD_ONLY STATIC READ_ONLY FOR
SELECT i.[IdDoc], i.[IdDoc], i.[Tip], i.[NumarDoc], i.[DataDoc], i.[Scadenta], i.[DenumireClient], i.[Suma], i.[Tva], i.[Total], i.[Neachitat], i.[IDAgent], i.[Adaos], i.[Accize], i.[ContDAccize], i.[ContCAccize], i.[Comanda], i.[CursReferinta], i.[CreatedBy], i.[iUserWorking], i.[DataCrearii], i.[ModifiedDate], i.[Modul], i.[RowGuid], i.[aviz], i.[Tiparit], i.[Anulat], i.[Cont], i.[IsStorno] FROM INSERTED i
OPEN LOG_CURSOR
FETCH NEXT FROM LOG_CURSOR INTO @NEW_MSSQLLM$0, @NEW_MSSQLLM$5, @NEW_MSSQLLM$6, @NEW_MSSQLLM$7, @NEW_MSSQLLM$8, @NEW_MSSQLLM$9, @NEW_MSSQLLM$10, @NEW_MSSQLLM$11, @NEW_MSSQLLM$12, @NEW_MSSQLLM$13, @NEW_MSSQLLM$14, @NEW_MSSQLLM$15, @NEW_MSSQLLM$16, @NEW_MSSQLLM$17, @NEW_MSSQLLM$18, @NEW_MSSQLLM$19, @NEW_MSSQLLM$20, @NEW_MSSQLLM$21, @NEW_MSSQLLM$22, @NEW_MSSQLLM$23, @NEW_MSSQLLM$24, @NEW_MSSQLLM$25, @NEW_MSSQLLM$26, @NEW_MSSQLLM$27, @NEW_MSSQLLM$28, @NEW_MSSQLLM$29, @NEW_MSSQLLM$30, @NEW_MSSQLLM$31, @NEW_MSSQLLM$32
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC dbo.P_INSERTINTOLOGTABLE 'dbo', 'Iesiri', 'I', 'IdDoc', @NEW_MSSQLLM$0, @VAR_ID = @VAR_ID OUTPUT
IF (UPDATE([IdDoc]))
BEGIN
IF (@NEW_MSSQLLM$5 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'IdDoc', @NEW_VALUE = @NEW_MSSQLLM$5
END -- END IF
IF (UPDATE([Tip]))
BEGIN
IF (@NEW_MSSQLLM$6 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Tip', @NEW_VALUE = @NEW_MSSQLLM$6
END -- END IF
IF (UPDATE([NumarDoc]))
BEGIN
IF (@NEW_MSSQLLM$7 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'NumarDoc', @NEW_VALUE = @NEW_MSSQLLM$7
END -- END IF
IF (UPDATE([DataDoc]))
BEGIN
IF (@NEW_MSSQLLM$8 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'DataDoc', @NEW_VALUE = @NEW_MSSQLLM$8
END -- END IF
IF (UPDATE([Scadenta]))
BEGIN
IF (@NEW_MSSQLLM$9 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Scadenta', @NEW_VALUE = @NEW_MSSQLLM$9
END -- END IF
IF (UPDATE([DenumireClient]))
BEGIN
IF (@NEW_MSSQLLM$10 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'DenumireClient', @NEW_VALUE = @NEW_MSSQLLM$10
END -- END IF
IF (UPDATE([Suma]))
BEGIN
IF (@NEW_MSSQLLM$11 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Suma', @NEW_VALUE = @NEW_MSSQLLM$11
END -- END IF
IF (UPDATE([Tva]))
BEGIN
IF (@NEW_MSSQLLM$12 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Tva', @NEW_VALUE = @NEW_MSSQLLM$12
END -- END IF
IF (UPDATE([Total]))
BEGIN
IF (@NEW_MSSQLLM$13 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Total', @NEW_VALUE = @NEW_MSSQLLM$13
END -- END IF
IF (UPDATE([Neachitat]))
BEGIN
IF (@NEW_MSSQLLM$14 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Neachitat', @NEW_VALUE = @NEW_MSSQLLM$14
END -- END IF
IF (UPDATE([IDAgent]))
BEGIN
IF (@NEW_MSSQLLM$15 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'IDAgent', @NEW_VALUE = @NEW_MSSQLLM$15
END -- END IF
IF (UPDATE([Adaos]))
BEGIN
IF (@NEW_MSSQLLM$16 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Adaos', @NEW_VALUE = @NEW_MSSQLLM$16
END -- END IF
IF (UPDATE([Accize]))
BEGIN
IF (@NEW_MSSQLLM$17 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Accize', @NEW_VALUE = @NEW_MSSQLLM$17
END -- END IF
IF (UPDATE([ContDAccize]))
BEGIN
IF (@NEW_MSSQLLM$18 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'ContDAccize', @NEW_VALUE = @NEW_MSSQLLM$18
END -- END IF
IF (UPDATE([ContCAccize]))
BEGIN
IF (@NEW_MSSQLLM$19 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'ContCAccize', @NEW_VALUE = @NEW_MSSQLLM$19
END -- END IF
IF (UPDATE([Comanda]))
BEGIN
IF (@NEW_MSSQLLM$20 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Comanda', @NEW_VALUE = @NEW_MSSQLLM$20
END -- END IF
IF (UPDATE([CursReferinta]))
BEGIN
IF (@NEW_MSSQLLM$21 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'CursReferinta', @NEW_VALUE = @NEW_MSSQLLM$21
END -- END IF
IF (UPDATE([CreatedBy]))
BEGIN
IF (@NEW_MSSQLLM$22 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'CreatedBy', @NEW_VALUE = @NEW_MSSQLLM$22
END -- END IF
IF (UPDATE([iUserWorking]))
BEGIN
IF (@NEW_MSSQLLM$23 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'iUserWorking', @NEW_VALUE = @NEW_MSSQLLM$23
END -- END IF
IF (UPDATE([DataCrearii]))
BEGIN
IF (@NEW_MSSQLLM$24 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'DataCrearii', @NEW_VALUE = @NEW_MSSQLLM$24
END -- END IF
IF (UPDATE([ModifiedDate]))
BEGIN
IF (@NEW_MSSQLLM$25 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'ModifiedDate', @NEW_VALUE = @NEW_MSSQLLM$25
END -- END IF
IF (UPDATE([Modul]))
BEGIN
IF (@NEW_MSSQLLM$26 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Modul', @NEW_VALUE = @NEW_MSSQLLM$26
END -- END IF
IF (UPDATE([RowGuid]))
BEGIN
IF (@NEW_MSSQLLM$27 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'RowGuid', @NEW_VALUE = @NEW_MSSQLLM$27
END -- END IF
IF (UPDATE([aviz]))
BEGIN
IF (@NEW_MSSQLLM$28 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'aviz', @NEW_VALUE = @NEW_MSSQLLM$28
END -- END IF
IF (UPDATE([Tiparit]))
BEGIN
IF (@NEW_MSSQLLM$29 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Tiparit', @NEW_VALUE = @NEW_MSSQLLM$29
END -- END IF
IF (UPDATE([Anulat]))
BEGIN
IF (@NEW_MSSQLLM$30 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Anulat', @NEW_VALUE = @NEW_MSSQLLM$30
END -- END IF
IF (UPDATE([Cont]))
BEGIN
IF (@NEW_MSSQLLM$31 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'Cont', @NEW_VALUE = @NEW_MSSQLLM$31
END -- END IF
IF (UPDATE([IsStorno]))
BEGIN
IF (@NEW_MSSQLLM$32 IS NOT NULL)
EXEC dbo.P_INSERTINTOLOGTABLEDETAILS @VAR_ID, 'IsStorno', @NEW_VALUE = @NEW_MSSQLLM$32
END -- END IF
FETCH NEXT FROM LOG_CURSOR INTO @NEW_MSSQLLM$0, @NEW_MSSQLLM$5, @NEW_MSSQLLM$6, @NEW_MSSQLLM$7, @NEW_MSSQLLM$8, @NEW_MSSQLLM$9, @NEW_MSSQLLM$10, @NEW_MSSQLLM$11, @NEW_MSSQLLM$12, @NEW_MSSQLLM$13, @NEW_MSSQLLM$14, @NEW_MSSQLLM$15, @NEW_MSSQLLM$16, @NEW_MSSQLLM$17, @NEW_MSSQLLM$18, @NEW_MSSQLLM$19, @NEW_MSSQLLM$20, @NEW_MSSQLLM$21, @NEW_MSSQLLM$22, @NEW_MSSQLLM$23, @NEW_MSSQLLM$24, @NEW_MSSQLLM$25, @NEW_MSSQLLM$26, @NEW_MSSQLLM$27, @NEW_MSSQLLM$28, @NEW_MSSQLLM$29, @NEW_MSSQLLM$30, @NEW_MSSQLLM$31, @NEW_MSSQLLM$32
END -- WHILE
CLOSE LOG_CURSOR
DEALLOCATE LOG_CURSOR
END -- END IF
END -- END TRIGGER
 10/15/2010 1:54:10 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: "The refresh key defined for table is not found."
 (N/A)
Nu m-am gandit ca, in trigger, faci insert intr-o tabela cu id autogenerat, iar apoi folosesti @@IDENTITY pe prima tabela ...
Ca sa poti folosi SCOPE_IDENTITY ar trebui sa faci insertul printr-o procedura stocata, care sa returneze ID-ul.
Dupa parerea mea, ai complicat cam tare lucrurile.
Pentru tabela de audit poti compune cheia primara din ID, nume camp si un timestamp - care, de altfel, vad ca lipseste din tabela de audit -, si nu ai mai avea nevoie de un ID autoinc.
Poti evita toate problemele ce apar din generarea id-ului pe server inlocuind cheia primara autoincrement cu o cheie GUID, care poate fi generata local, inainte de inserarea liniei pe server.
Pe de alta parte, cursorul in trigger nu este cea mai indicata varianta, daca nu tii sa degradezi performanta serverului.
Se poate realiza acelasi lucru cu un select pivot, care sa puna campurile pe linii, si sa selectezi apoi din el doar valorile modificate. Daca folosesti si clauza OUTPUT, se poate insera direct in tabela de audit. Practic, tot codul din trigger s-ar reduce la o singura comanda.

Daniel Buduru
 10/15/2010 10:01:20 AM
User is offlinevicos
139 posts
5th


Re: "The refresh key defined for table is not found."
 (N/A)
 Ca sa poti folosi SCOPE_IDENTITY ar trebui sa faci insertul printr-o procedura stocata, care sa returneze ID-ul.


Un ex. te rog de acest gen!

 Se poate realiza acelasi lucru cu un select pivot, care sa puna campurile pe linii, si sa selectezi apoi din el doar valorile modificate. Daca folosesti si clauza OUTPUT, se poate insera direct in tabela de audit. Practic, tot codul din trigger s-ar reduce la o singura comanda.


Cum as putea face un SELECT PIVOT doar cu valorile modificate si cum pot INSERA direct In tabela AUDIT? Imi poti posta un cod simplu ca sa am un punct de plecare?

Multumesc
 10/15/2010 11:17:24 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: "The refresh key defined for table is not found."
 (N/A)
1. Vezi aici un exemplu
http://msdn.microsoft.com/en-us/library/ks9f57t0(VS.71).aspx

2. Ma gandeam la UNPIVOT, dar am scris pivot. 
Uite un exemplu (am luat doar cateva campuri, poti completa pe restul).

INSERT INTO Audit (schema, tabela, iddoc, field_name, Field_value)
SELECT 'dbo', 'iesiri', ii.* FROM
(Select iddoc, Field_name, Field_value FROM
(SELECT [IdDoc]
, CAST([Tip] as nvarchar(255)) as tip
, cast([NumarDoc] as nvarchar(255)) as NumarDoc
, Convert(nvarchar(255),[DataDoc],112) as DataDoc
, Convert(nvarchar(255),[Scadenta], 112) as Scadenta
, Cast([DenumireClient] as nvarchar(255)) as DenumireClient
, Cast([Suma] as nvarchar(255)) as Suma
, Cast([Tva] as nvarchar(255)) as tva
, CAST([Total] as nvarchar(255)) as Total
, Cast([Neachitat] as nvarchar(255)) as Neachitat)
  FROM Inserted) pvt
UNPIVOT (  Field_value for Field_name IN
        (tip, NumarDoc, DataDoc, Scadenta, DenumireClient, Suma, Tva, Total, Neachitat)) AS unpvt) ii
 GO
 
- am presupus ca Scadenta e de tip date
- evident, codul de mai sus nu e testat, deci pot fi ceva erori de tastare

Selectul ia doar valorile nenule ale campurilor. Daca vrei sa compari cu valorile din deleted, faci unpivot si pe deleted,
apoi faci un join intre cele doua  selecturi cu ce conditie de filtru doresti.

Vad ca in tabela exista si un rowguid, deci ai putea renunta la id autoincrement.
Un id autoincrement are doua dezavantaje:
1 - e generat server side si deja te-ai lovit de complicatiile obtinerii lui la client
2 - daca baza de date e distribuita iar sincronizarea se face periodic, trebuie luate masuri ca id-urile generate in fiecare locatie sa nu se suprapuna.
Una peste alta, o cheie primara unica independent de masina/locatie/tabela e de preferat unei chei numerice, iar GUID a aparut tocmai din aceasta necesitate.



Daniel Buduru
  Visual FoxPro  Client/Server  "The refre...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement