- 28.10.2019
- 7 minute de citit
In acest articol
Acest subiect descrie cum sunt validate valorile entitatii de date, cum pot fi furnizate valorile implicite si cum se utilizeaza campurile care nu sunt mapate la valorile sursei de date, dar care contin date virtuale sau calculate (campuri nemapate).
Validari
Validarile pot fi definite pe tabelele care fac backup pentru entitati, atat la nivel de camp, cat si la nivel de inregistrare. Validarile pot fi definite si la nivelul entitatii de date.
Tabel (sursa de date) vs. validarea entitatii
Entitatile sunt sustinute de tabele (surse de date), iar validarile sunt definite pentru aceste tabele atat la nivelul campului ( Table.validateField () ), cat si la nivelul inregistrarii ( Table.validateWrite () ). Validarile sunt respectate de entitatile de date care sunt construite folosind acele tabele. Desi aceste validari sunt intrinseci tabelelor care sustin o entitate de date, validarile pot fi definite si la nivelul entitatii de date. La fel ca validarile bazate pe tabel, validarile bazate pe entitati pot fi scrise la nivelul campului ( DataEntity.validateField () ) sau la nivelul inregistrarii ( DataEntity.validateWrite () ).
Comportament de validare bazat pe tabel
Validarile tabelelor sunt declansate automat ca parte a operatiilor CUD. Table.ValidateField, AllowEdit, AllowEditOnCreate Validarile la nivel de camp sunt declansate automat atunci cand efectuati insertii sau actualizari ale entitatii de date. Acest lucru este valabil pentru toate caile (X ++, OData si asa mai departe). Aceste validari au loc in timpul procesului de mapare, cand campurile sunt mapate de la o entitate la surse de date individuale.
Dupa ce valorile campului din entitatea de date sunt copiate in campurile sursei de date mapate, validarile campului se executa pe campurile setate. Validarile includ validateField la nivel de tabel , care valideaza AllowEdit si AllowEditOnCreate . Daca o validare esueaza din cauza unei erori, validarea pentru campurile ramase continua. In cele din urma, validarea verifica daca a aparut o eroare in timpul procesului de validare pentru oricare dintre sursele de date. Daca a aparut o eroare, erorile de proces se elimina in acest moment si validateWrite () la nivel de tabel nu este apelat. Pentru a trece peste validateField pentru un tabel back-end, un consumator poate apela DataEntity.skipDataSourceValidateField (Int _DataEntityFieldId, Boolean _skip). Retineti ca ID-ul campului pentru aceasta metoda este ID-ul campului campului mapat entitate de date, nu campul tabelului back-end. Utilizand urmatorul API, puteti sari peste validare pentru un anumit camp, indiferent de consumator.
Table.ValidateWrite Validari ValidateWrite la nivel de inregistrare care sunt definite in tabelele back-end sunt declansate automat atunci cand efectuati insertii si actualizari de entitati de date. Acest lucru este valabil pentru toate caile (X ++, OData si asa mai departe). Aceste validari au loc chiar inainte ca inserarea sau actualizarea reala sa fie aplicata sursei de date. Daca validarea nu reuseste, se genereaza o eroare si procesul se opreste pentru alte surse de date.
Pentru a trece peste validateWrite pentru toate tabelele back-end pentru o entitate de date, un consumator poate apela DataEntity.skipDataSourceValidateWrite (_skip boolean) . Aceasta metoda activeaza sau dezactiveaza validateWrite pentru toate sursele de date. Utilizand urmatorul API, puteti sari peste validare pentru o anumita sursa de date, indiferent de consumator.
Table.ValidateDelete Validare la nivel de inregistrare Validare Stergere validari care sunt definite in tabelele back-end sunt declansate automat atunci cand efectuati stergerea entitatii de date. Acest lucru este valabil pentru toate caile (X ++, OData si asa mai departe). Aceste validari au loc chiar inainte ca stergerea sa fie aplicata sursei de date. Daca validarea nu reuseste, se genereaza o eroare si procesul se opreste pentru alte surse de date.
negros follando a blancas masajes eroticos camara oculta
feet hentai descargar videos porno gratis
pelis porno español online follando con abuelas
porno español dinero porno senegal
le pilla masturbandose sexo casero españa
incesto gratis vecina mirona
sexo videos caseros ver sexo gratis
masajes eroticos con final feliz videos porno online
folladas caseras reales porno gay castellano
incesto xxx se folla a
hombres corriendose voyeur playa
maduras enculadas mamadas en la playa
metiendo mano en el bus porno espaniol
porno español abuelas hermanos españoles follando
incesto ruso viejas tetonas
tetas playa supertetas
sexo playa nudista cornudos consentidos
xxx incesto real porno violada
violacion real porno pornografia gratis
maduras.com violada xxx
Pentru a sari peste validateDelete pentru toate tabelele back-end pentru o entitate de date, un consumator poate apela DataEntity.skipDataSourceValidateDelete (Boolean _skip) . Aceasta metoda activeaza sau dezactiveaza validateDelete pentru toate sursele de date. Utilizand urmatorul API, puteti sari peste validare pentru o anumita sursa de date, indiferent de consumator.
Comportament de validare bazat pe entitati
Validare tinta apelant DataEntity.ValidateField
- Tipuri de date
- Relatii obligatorii (atat tabele, cat si tipuri extinse de date [EDT])
- Orice validare personalizata
- Nu apeleaza validateField pentru campurile de tabel mapate subiacente
- Se apeleaza automat de la OData
- Este apelat de motorul formularului cand un camp este modificat
- Nu este apelat automat daca o inserare / actualizare este lansata din codul X ++
DataEntity.ValidateWrite
- Coloane obligatorii
- Relatii (atat tabele, cat si EDT)
- Orice validare personalizata
- Nu apeleaza la nivel de tabel validateWrite pentru tabelele subiacente
- Se apeleaza automat de la OData
- Este apelat de motorul formularului atunci cand este salvata o inregistrare.
- Nu este apelat automat daca o inserare / actualizare este lansata din codul X ++
DataEntity.ValidateDelete
- DeleteActions
- Orice validare personalizata
- Nu apeleaza la nivel de tabel validateDelete pentru tabelele subiacente
- Se apeleaza automat de la OData.
- Este apelat de motorul formularului cand o inregistrare este stearsa
- Nu este apelat automat daca o stergere este declansata din codul X ++
Valori implicite
Valorile implicite pot fi furnizate pentru initializari si randuri.
Initializari
DataEntity.initValue: o entitate de date este initializata cu valori implicite si utilizand orice logica personalizata care este prezenta in initValue la nivel de entitate . Aceasta metoda nu este apelata automat cand se realizeaza o inserare sau o actualizare pe o entitate de date din X ++. Trebuie apelat in mod explicit daca este necesar. Metoda este apelata automat de motorul formularului atunci cand este creata o noua inregistrare. DataEntity.initValue nu apeleaza metoda initValue pentru tabelele back-end care sunt utilizate in entitatea de date. Table.initValue: initValue la nivel de tabel , asa cum este definit pentru tabelele back-end, este declansat atunci cand efectuati o insertie de entitate de date. Acest lucru este valabil pentru toate caile (X ++, OData si asa mai departe). Table.initValue este rulat chiar inainte ca entitatea sa fie mapata la campurile sursei de date.
Pentru a omite initValue la nivel de entitate pentru toate tabelele back-end pentru o entitate de date, un consumator poate apela DataEntity.skipDataSourceInitValue (Boolean _skip) . Aceasta metoda activeaza sau dezactiveaza initValue pentru toate sursele de date. Utilizand urmatorul API, puteti sari peste initValue pentru un anumit camp, indiferent de consumator.
DefaultRow
DataEntity.DefaultRow: DataEntity.DefaultRow este utilizat impreuna cu defaultField si getDefaultingDependencies pentru a furniza valorile implicite. Nu este apelat automat de X ++ sau de motorul formularului. Table.DefaultRow: Table.DefaultRow este apelat automat pentru fiecare sursa de date dupa finalizarea maparii si inainte de inserarea si validarea sursei de date.
Campuri neasociate
O entitate de date poate avea campuri nemapate , in plus acele campuri care sunt mapate direct la campurile surselor de date. Exista doua mecanisme pentru generarea de valori pentru campurile nemapate:
- Cod personalizat X ++
- SQL care este rulat de Microsoft SQL Server
Cele doua tipuri de campuri neasociate sunt virtuale si calculate . Campurile neacceptate accepta intotdeauna actiunile de citire, dar specificatia caracteristicii ar putea sa nu necesite niciun efort de dezvoltare pentru a sustine actiunile de scriere.
Camp virtual
- Un camp nepersistent.
- Controlat de cod X ++ personalizat.
- Citirea si scrierea au loc prin intermediul codului X ++ personalizat.
- De obicei utilizat pentru valorile de admisie care sunt calculate utilizand codul X ++ si nu pot fi inlocuite cu coloane calculate.
Camp calculat
- Valoarea este generata de o coloana calculata de vizualizare SQL.
- In timpul citirilor, datele sunt calculate de SQL si preluate direct din vizualizare.
- Pentru scrieri, codul X ++ personalizat trebuie sa analizeze valoarea de intrare si apoi sa scrie valorile analizate in campurile obisnuite ale entitatii de date. Valorile sunt stocate in campurile obisnuite ale surselor de date ale entitatii.
- Folosit mai ales pentru citiri.
- Este o idee buna sa utilizati coloane calculate in loc de campuri virtuale ori de cate ori puteti, deoarece coloanele calculate sunt calculate la nivelul SQL Server, in timp ce campurile virtuale sunt calculate rand cu rand in X ++.
Proprietatile campurilor neasociate
Categorie Nume Tip Valoare implicita Date de comportament IsComputedField Nu Da Da
- Da: campul este sincronizat ca o coloana calculata de vizualizare SQL. Este necesara o metoda X ++ pentru a calcula sirul de definitie SQL pentru coloana. Definitia coloanei virtuale este statica si este utilizata atunci cand entitatea este sincronizata. Dupa aceea, metoda X ++ nu este apelata in timpul rularii.
- Nu: campul este un adevarat camp virtual, unde valorile de intrare si de iesire sunt controlate complet prin cod personalizat.
Date ComputedFieldMethod String O metoda statica DataEntity in X ++ este utilizata pentru a construi expresia SQL care genereaza definitia campului. Aceasta proprietate este dezactivata si irelevanta daca proprietatea IsComputedField este setata la nr . Metoda este necesara daca proprietatea IsComputedField este setata la Da . Sir de date ExtendedDataType
Comparatie de camp nelimat
Camp virtual Camp calculat Proprietati metadate Este calculat = Nu
- Este calculat = Da
- Metoda campului calculat = metoda statica
Citit
- X ++ (suprascrie postLoad )
- Rand cu rand
- Coloana calculata SQL
- Este posibila citirea pe seturi
Scrieti X ++ (override mapEntityToDataSource ) X ++ (override mapEntityToDataSource ) Avantaje
- Nelegat de schema, mentine contractul public la fel, dar implementarea se poate schimba
- Apelati metodele X ++
Citiri mai rapide, exportul mare poate avea loc direct din vizualizare
Exemple
Urmatorul tabel ofera un exemplu calculat daca exista o relatie UnitOfMeasure si il afiseaza intr-un camp nemapat.
Camp virtual Camp calculat La postLoad () // Verificati daca exista inregistrare in UnitOfMeasureInternalCode.UnitOfMeasure // Set hasFixedInternalCode value based on the field if (this.UnitOfMeasure) this.HasFixedInternalCodeVirtual = NoYes :: Da; else this.HasFixedInternalCodeVirtual = Nu Da :: Nu; Pe computedFieldMethod () // Instructiune de coloana calculata SQL dorita (CASE WHEN T2.RECID IS NULL THEN 0 ELSE 1 END) AS INT)








