DataStore
A Datastore is the interface object provided by ORDA to reference and access a database. Datastore
objects are returned by the following commands:
- ds: a shortcut to the main datastore
- Open datastore: to open any remote datastore
Resumo
ds
Histórico
Versão | Mudanças |
---|---|
v18 | Support of localID parameter |
v17 | Adicionado |
ds { ( localID : Text ) } : cs.DataStore
Parameter | Type | Descrição | |
---|---|---|---|
localID | Texto | -> | ID local del armazém de dados remoto a devolver |
Resultado | cs.DataStore | <- | Referencia ao armazém de dados |
Descrição
O comando ds
devolve uma referência ao armazém de dados que coincide com o banco de dados 4D atual ou com o banco de dados designada por localID.
Se omitir o parâmetro localID (ou se passa uma string vazia ""), o comando devolve uma referência ao armazém de dados que coincide com a base de dados local de 4D (ou a base de datos de 4D Server em caso de abrir uma base de dados remota em 4D Server). O armazém de dados se abre automaticamente e está disponível diretamente através de ds
.
Também pode obter uma referencia em um datastore remoto aberto passando seu id local no parâmetro localID. O armazém de dados deve ter sido aberto previamente com o comando Open datastore
pelo banco de dados atual (local ou componente). A identificação local se define quando se utilizar este comando.
The scope of the local id is the database where the datastore has been opened.
Se não encontrar nenhum armazém de dados localID, o comando devolve Null.
Objects available in the cs. Datastore
are mapped from the target database with respect to the ORDA general rules.
Exemplo 1
Usar a datastore principal do banco de dados 4D:
$result:=ds.Employee.query("firstName = :1";"S@")
Exemplo 2
var $connectTo; $firstFrench; $firstForeign : Object
var $frenchStudents; $foreignStudents : cs.DataStore
$connectTo:=New object("type";"4D Server";"hostname";"192.168.18.11:8044")
$frenchStudents:=Open datastore($connectTo;"french")
$connectTo.hostname:="192.168.18.11:8050"
$foreignStudents:=Open datastore($connectTo;"foreign")
//...
//...
$firstFrench:=getFirst("french";"Students")
$firstForeign:=getFirst("foreign";"Students")
//getFirst method
//getFirst(localID;dataclass) -> entity
#DECLARE( $localId : Text; $dataClassName : Text ) -> $entity : 4D.Entity
$0:=ds($localId)[$dataClassName].all().first()
Open datastore
Histórico
Versão | Mudanças |
---|---|
v18 | Adicionado |
Open datastore( connectionInfo : Object ; localID : Text ) : cs.DataStore
Parameter | Type | Descrição | |
---|---|---|---|
connectionInfo | Objeto | -> | Propriedades de conexão utilizadas para alcançar o armazém de datos remoto |
localID | Texto | -> | Id para assignar ao armazém de dados aberto na aplicação local (obrigatorio) |
Resultado | cs.DataStore | <- | Objeto do armazém de dados |
Descrição
O comando Open datastore
conecta a aplicação ao banco identificado por connectionInfo parameter e retorna um objeto correpondente cs.DataStore
associado com o alias local localID.
O banco de dados connectionInfo 4D deve estar disponível como armazém de dados remoto, ou seja:
- seu servidor web deve ser lançado com http ou https ativado,
- sua opção Expor como servidor REST deve estar marcada,
- se dispõe de ao menos uma licença cliente.
Se não se encontrar nenhum banco de dados coincidente, Open datastore
devolve Null.
localID é um alias local para a sessão aberta no armazém de dados remoto. Se localID já existir na aplicação, se utiliza. Em caso contrário, se cria uma nova sessão localID quando se utiliza o objeto datastore.
Objects available in the cs. Datastore
are mapped from the target database with respect to the ORDA general rules.
Quando abrir a sessão, as sentenças abaixo são equivalentes e devolvem uma referência sobre o mesmo objeto datastore:
$myds:=Open datastore(connectionInfo;"myLocalId")
$myds2:=ds("myLocalId")
//$myds and $myds2 are equivalent
Passe em connectionInfo um objeto que desceva o armazém de dados remoto ao que quiser se conectar. Pode conter as propriedades abaixo (todas as propriedades são opcionais menos hostname):
Propriedade | Type | Descrição |
---|---|---|
hostname | Texto | Name or IP address of the remote database + ":" + port number (port number is mandatory) |
user | Texto | User name |
password | Texto | User password |
idleTimeout | Inteiro longo | Inactivity session timeout (in minutes), after which the session is automatically closed by 4D. If omitted, default value is 60 (1h). The value cannot be < 60 (if a lower value is passed, the timeout is set to 60). For more information, see Closing sessions. |
tls | Booleano | Use secured connection(*). If omitted, false by default. Using a secured connection is recommended whenever possible. |
type | Texto | Must be "4D Server" |
(*) Se tls for true, se utiliza o protocolo HTTPS se:
- HTTPS for ativado no armazém de dados remoto
- o número de porto especificado coincide com o porto HTTPS configurado nos ajustes do banco de dados
- um certificado válido e uma chave privada de criptografia estão instalados no banco de dados. Senão é mostrado o erro "1610 - A remote request to host xxx has failed"
Exemplo 1
Conexão a uma datastore remota sem usuário ou senha:
var $connectTo : Object
var $remoteDS : cs.DataStore
$connectTo:=New object("type";"4D Server";"hostname";"192.168.18.11:8044")
$remoteDS:=Open datastore($connectTo;"students")
ALERT("This remote datastore contains "+String($remoteDS.Students.all().length)+" students")
Exemplo 2
Conexão a uma datastore remota com usuário/ senha/ timetou/ tls
var $connectTo : Object
var $remoteDS : cs.DataStore
$connectTo:=New object("type";"4D Server";"hostname";\"192.168.18.11:4443";\
"user";"marie";"password";$pwd;"idleTimeout";70;"tls";True)
$remoteDS:=Open datastore($connectTo;"students")
ALERT("This remote datastore contains "+String($remoteDS.Students.all().length)+" students")
Exemplo 3
Trabalhando com várias datastores remotas:
var $connectTo : Object
var $frenchStudents; $foreignStudents : cs.DataStore
$connectTo:=New object("hostname";"192.168.18.11:8044")
$frenchStudents:=Open datastore($connectTo;"french")
$connectTo.hostname:="192.168.18.11:8050"
$foreignStudents:=Open datastore($connectTo;"foreign")
ALERT("They are "+String($frenchStudents.Students.all().length)+" French students")
ALERT("They are "+String($foreignStudents.Students.all().length)+" foreign students")
Error management
Em caso de erro, o comando devolve Null. Se não for possível acessar o armazem de dados remotos (endereço incorreto, servidor web não inciiado, http e https não habilitados...), se produz o erro 1610 " Uma petição remota ao host XXX falhou". Pode interceptar este erro com um método instalado por ON ERR CALL
.
.dataclassName
Histórico
Versão | Mudanças |
---|---|
v17 | Adicionado |
.dataclassName : 4D.DataClass
Descrição
Cada classe de dados de um armazém de dados está disponível como uma propriedad de objeto DataStoredata. O objeto devolvido contém uma descrição da classe de dados.
Exemplo
var $emp : cs.Employee
var $sel : cs.EmployeeSelection
$emp:=ds.Employee //$emp contiene la dataclass Employee
$sel:=$emp.all() //obtém uma seleção de entidades de todos os empregados
//também pode escrever diretamente:
$sel:=ds.Employee.all()
.cancelTransaction()
Histórico
Versão | Mudanças |
---|---|
v18 | Adicionado |
.cancelTransaction() | Parameter | Type | | Descrição | | --------- | ---- |::| ------------------------------- | | | | | Does not require any parameters |
Descrição
A função .cancelTransaction()
cancela a transação aberta pela função .startTransaction()
no nível correspondente do processo atual para o datastore especificado.
A função .cancelTransaction()
cancela qualquer mudança realizado nos dados durante a transação.
Pode aninhar várias transações (subtransações). Se a transação principal for cancelada, todas suas subtransações também são canceladas, mesmo se validadas individualmente usando a função .validateTransaction()
.
Exemplo
Ver exemplo da função .startTransaction()
.
.clearAllRemoteContexts()
Histórico
Versão | Mudanças |
---|---|
v19 R5 | Adicionado |
.clearAllRemoteContexts() | Parameter | Type | | Descrição | | --------- | ---- |::| ------------------------------- | | | | | Does not require any parameters |
Descrição
The .clearAllRemoteContexts()
functionclears all the attributes for all the active contexts in the datastore.
This function is mainly used in the context of debugging. One thing to keep in mind is that when you open the debugger, it sends requests to the server and queries all the dataclass attributes to display them. This can overload your contexts with unnecessary data.
In such cases, you can use .clearAllRemoteContexts()
to clear your contexts and keep them clean.
See also
.getRemoteContextInfo()
.getAllRemoteContexts()
.setRemoteContextInfo()
.encryptionStatus()
Histórico
Versão | Mudanças |
---|---|
v17 R5 | Adicionado |
.encryptionStatus(): Object
Parameter | Type | Descrição | |
---|---|---|---|
Resultado | Objeto | <- | Informação sobre o cifrado do armazém de dados atual e de cada tabela |
Descrição
A função .encryptionStatus()
devolve um objeto que proporciona o estado de criptografia do arquivo de datos atual (ou seja, o arquivo de dados do ds
datastore). Também se proporciona o estado de cada tabela.
Use the
Data file encryption status
command to determine the encryption status of any other data file.
Returned value
O objeto retornado contém as propriedades abaixo:
Propriedade | Type | Descrição | ||
---|---|---|---|---|
isEncrypted | Booleano | True se o arquivo de dados estiver criptografado | ||
keyProvided | Booleano | True se proporcionar a chave de encriptação que coincide com o arquivo de dados encriptados(*). | ||
tabelas | Objeto | Objeto que contém tantas propriedades como tabelas encriptadas ou codificadas. | ||
tableName | Objeto | Tabla encriptada ou cifrada | ||
name | Texto | Nombre da tabela | ||
num | Número | Table number | ||
isEncryptable | Booleano | Verdadero se a tabela estiver declarada como encriptada no arquivo de estrutura | ||
isEncrypted | Booleano | True se os registros da tabela estiverem encriptados no arquivo de dados |
(*) a chave de criptografia pode ser fornecida:
- com o comando
.provideDataKey()
, - na raíz de um dispositivo conectado antes de abrir o datastore,
- com o comando
Discover data key
.
Exemplo
Se quiser saber o número de tabelas criptografadas no arquivo de dados atual:
var $status : Object
$status:=dataStore.encryptionStatus()
If($status.isEncrypted) //o banco de dados está encriptado
C_LONGINT($vcount)
C_TEXT($tabName)
For each($tabName;$status.tables)
If($status.tables[$tabName].isEncrypted)
$vcount:=$vcount+1
End if
End for each
ALERT(String($vcount)+" encrypted table(s) in this datastore.")
Else
ALERT("This database is not encrypted.")
End if
.getAllRemoteContexts()
Histórico
Versão | Mudanças |
---|---|
v19 R5 | Adicionado |
.getAllRemoteContexts() : Collection
Parameter | Type | Descrição | |
---|---|---|---|
Resultado | Objeto | <- | Collection of optimization context objects |
Advanced mode: This function is intended for developers who need to customize ORDA default features for specific configurations. In most cases, you will not need to use it.
Descrição
The .getAllRemoteContexts()
function returns a collection of objects containing information on all the active optimization contexts in the datastore.
For more information on how contexts can be created, see client/server optimization.
Each object in the returned collection has the properties listed in the .getRemoteContextInfo()
section.
Exemplo
The following code sets up two contexts and retrieves them using .getAllRemoteContexts()
:
var $ds : 4D. DataStoreImplementation
var $persons : cs. PersonsSelection
var $addresses : cs. AddressSelection
var $p : cs. PersonsEntity
var $a : cs. AddressEntity
var $contextA; $contextB : Object
var $info : Collection
var $text : Text
// Open remote datastore
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
// Set context A
$contextA:=New object("context"; "contextA")
$persons:=$ds. Persons.all($contextA)
$text:="" For each ($p; $persons)
$text:=$p.firstname+" lives in "+$p.address.city+" / " End for each
// Set context B
$contextB:=New object("context"; "contextB")
$addresses:=$ds. Address.all($contextB)
$text:="" For each ($a; $addresses)
$text:=$a.zipCode End for each
// Get all remote contexts (in this case, contextA and contextB)
$info:=$ds.getAllRemoteContexts()
//$info = [{name:"contextB"; dataclass:"Address"; main:"zipCode"},
{name:"contextA";dataclass:"Persons";main:"firstname,address.city"}]
This example serves as a demonstration, it is not meant for real implementation.
See also
.getRemoteContextInfo()
.setRemoteContextInfo()
.clearAllRemoteContexts()
.getInfo()
Histórico
Versão | Mudanças |
---|---|
v17 | Adicionado |
.getInfo(): Object
Parameter | Type | Descrição | |
---|---|---|---|
Resultado | Objeto | <- | Propiedades de datastore |
Descrição
A função .getInfo()
devolve um objeto que proporciona informação sobre a datastore. Esta função é útil para configurar o código genérico.
Returned object
Propriedade | Type | Descrição | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
type | string | ||||||||||||||||
networked | booleano | ||||||||||||||||
localID | texto | ID do armazém de dados na máquina. Corresponde à string localId dada com o comando Open datastore . String vazia ("") para o datastore principal. | |||||||||||||||
connection | object | Objeto descrevendo a conexão remota da datastore (não retornado para datastore principal) Propriedades disponiveis:
|
- Se a função
.getInfo()
for executada em um 4D Server ou 4D monoposto,networked
é False. - Se a função
.getInfo()
for executada em um 4D remoto,networked
é True
Exemplo 1
var $info : Object
$info:=ds.getInfo() //Executado em 4D Server ou 4D
//{"type":"4D","networked":false,"localID":""}
$info:=ds.getInfo() // Executado em 4D remoto
//{"type":"4D","networked":true,"localID":""}
Exemplo 2
Em um armazém de dados remoto:
var $remoteDS : cs.DataStore
var $info; $connectTo : Object
$connectTo:=New object("hostname";"111.222.33.44:8044";"user";"marie";"password";"aaaa")
$remoteDS:=Open datastore($connectTo;"students")
$info:=$remoteDS.getInfo()
//{"type":"4D Server",
//"localID":"students",
//"networked":true,
//"connection":{hostname:"111.222.33.44:8044","tls":false,"idleTimeout":2880,"user":"marie"}}
.getRemoteContextInfo()
Histórico
Versão | Mudanças |
---|---|
v19 R5 | Adicionado |
.getRemoteContextInfo(contextName : Text) : Object
Parameter | Type | Descrição | |
---|---|---|---|
contextName | Texto | -> | Name of the context |
Resultado | Objeto | <- | Description of the optimization context |
Advanced mode: This function is intended for developers who need to customize ORDA default features for specific configurations. In most cases, you will not need to use it.
Descrição
The .setRemoteContextInfo()
functionlinks the specified dataclass attributes to the contextName optimization context.
For more information on how optimization contexts can be created, see client/server optimization.
Returned object
The returned object has the following properties:
Propriedade | Type | Descrição |
---|---|---|
name | Texto | Name of the context |
main | Texto | Attribute(s) associated to the context (attribute names are separated by a comma) |
dataclass | Texto | Dataclass name |
currentItem (optional) | Texto | The attributes of the page mode if the context is linked to a list box. Returned as Null or empty text element if the context name is not used for a list box, or if there is no context for the currentItem |
Since contexts behave as filters for attributes, if main is returned empty, it means that no filter is applied, and that the server returns all the dataclass attributes.
Exemplo
See the example from the .setRemoteContextInfo() section.
See also
.setRemoteContextInfo()
.getAllRemoteContexts()
.clearAllRemoteContexts()
.getRequestLog()
Histórico
Versão | Mudanças |
---|---|
v17 R6 | Adicionado |
.getRequestLog() : Collection
Parameter | Type | Descrição | |
---|---|---|---|
Resultado | Coleção | <- | Coleção de objetos onde cada objeto descreve uma petição |
Descrição
The .getRequestLog()
function retorna as petições ORDA logadas na memória no lado do cliente. O registro de petições de ORDA deve ter sido habilidado anteriormente aatravés da função .startRequestLog()
.
Esta função deve ser chamada em um 4D remoto, do contrário devolve uma coleção vazia. Foi criado para depuração em configurações de cliente/servidor.
Returned value
Coleção de objetos de petição empilhados. A petição mais recente tem indice 0.
Para uma descrição do formato do registro de petições de ORDA, consulte a seção Perguntas do cliente ORDA.
Exemplo
Ver o exemplo 2 de .startRequestLog()
.
.isAdminProtected()
Histórico
Versão | Mudanças |
---|---|
v18 R6 | Adicionado |
.isAdminProtected() : Boolean
Parameter | Type | Descrição | |
---|---|---|---|
Resultado | Booleano | <- | True se o acesso ao Explorador de Dados estiver desativado, False se estiver ativado (por padrão) |
Descrição
A função .isAdminProtected()
devolve True
se o acesso a Data Explorer foi desativado para a sessão de trabalho.
Como padrão, o acesso ao Explorador de Dados se concede para as sessões webAdmin
, mas pode ser desativada para evitar qualquer acesso aos dados por parte dos administradores (ver a função .setAdminProtection()
).
See also
.makeSelectionsAlterable()
Histórico
Versão | Mudanças |
---|---|
v18 R5 | Adicionado |
.makeSelectionsAlterable() | Parameter | Type | | Descrição | | --------- | ---- |::| ------------------------------- | | | | | Does not require any parameters |
Descrição
A função .makeSelectionsAlterable()
estabelece todas as seleções de entidades como editáveis por padrão nos datastores da aplicação atual (incluindo datastores remotos). Está pensado para ser utilizado uma vez, por exemplo no método base On Startup
.
quando nesta função não for chamada, as novas seleções de entidades podem ser compartilháveis, dependendo da natureza de seu "pai", ou de como foram criadas.
Esta função não modifica as seleções de entidades criadas por
.copy()
ouOB Copy
quando se utilizar a opção explícitack shared
.
Compatibilidade: esta função só deve ser utilizada em projetos convertidos desde versões de 4D anteriores a 4D v18 R5 e que contenham chamadas .add(). Nste contexto, o uso de
.makeSelectionsAlterable()
pode poupar tempo ao restaurar instantaneamente o comportamento anterior de 4D nos projetos existentes. Por outro lado, utilizar este método em projetos novos criados em 4D v18 R5 e superiores não é recomendável, já que impede compartir as seleções de entidades, o que oferece maior rendimento e escalabilidade.
.provideDataKey()
Histórico
Versão | Mudanças |
---|---|
v17 R5 | Adicionado |
.provideDataKey( curPassPhrase : Text ) : Object
.provideDataKey( curDataKey : Object ) : Object
Parameter | Type | Descrição | |
---|---|---|---|
curPassPhrase | Texto | -> | Frase de cifrado atual |
curDataKey | Objeto | -> | Chave de criptografia de dados atual |
Resultado | Objeto | <- | Resultado da coincidência da chave de criptografia |
Descrição
A função .provideDataKey()
permite fornecer uma chave de cifrado de dados para o arquivo de dados atual da datastore e detecta se a chave coincide com os dados cifrados. Esta função pode ser utilizada ao abrir um banco de dados criptografado, ou ao executar qualquer operação de criptografia que precise da chave de criptografia, como por exemplo voltar a criptografar o arquivo de dados.
- A função
.provideDataKey()
deve ser chamada em um banco de dados criptografada. Se for chamado em uma database não criptografada, o erro 2003 (a chave de criptografia não corresponde aos dados) é retornada. Utilize o comandoEstado de cifrado do arquivo de dados
para determinar se o banco de dados estiver cifrada.- A função
.provideDataKey()
não pode ser chamada desde um 4D remoto ou uma datastore remoto encriptado.
Se utilizar o parâmetro curPassPhrase, passe a string utilizada para gerar a chave de cifrado de dados. Quando usar este parâmetro, uma chave de criptografia é gerada.
Se utilizar o parâmetro curDataKey, passe um objeto (com a propriedade encodedKey) que contenha a chave de cifrado dos dados. Esta chave pode ter sido gerada com o comando New data key
.
Se aportar uma chave de cifrado de dados válida, se adicionar a keyChain da memória e se ativa o modo de cifrado:
- todas as modificações de dados nas tabelas encriptadas são cifradas no disco (.4DD, .journal. 4Dindx)
- todos os dados carregados desde tabelas criptografadas são descifradas na memória
Resultado
O resultado da ordem se descreve no objeto devolvido:
Propriedade | Type | Descrição | |
---|---|---|---|
success | Booleano | True se a chave da criptografia proporcionada coincide com os dados encriptados, False em caso contrário | |
As seguintes propriedades são devolvidas só se success for FALSE | |||
status | Número | Código de erro (4 se a chave de encriptação fornecida for errada) | |
statusText | Texto | Mensagem de erro | |
errors | Coleção | Pilha de erros. O primeiro erro tem o índice mais alto | |
[ ].componentSignature | Texto | Nome do componente interno | |
[ ].errCode | Número | Número de erro | |
[ ].message | Texto | Mensagem de erro |
Se não for dada uma curPassphrase ou curDataKey, .provideDataKey()
devolve null (não é gerado nenhum erro).
Exemplo
var $keyStatus : Object
var $passphrase : Text
$passphrase:=Request("Enter the passphrase")
If(OK=1)
$keyStatus:=ds.provideDataKey($passphrase)
If($keyStatus.success)
ALERT("You have provided a valid encryption key")
Else
ALERT("You have provided an invalid encryption key, you will not be able to work with encrypted data")
End if
End if
.setAdminProtection()
Histórico
Versão | Mudanças |
---|---|
v18 R6 | Adicionado |
.setAdminProtection( status : Boolean )
Parameter | Type | Descrição | |
---|---|---|---|
status | Booleano | -> | True para desativar o acesso Data Explorer aos dados do porto webAdmin , False (por padrão) para outorgar o acesso |
Descrição
A função .setAdminProtection()
permite desabilitar qualquer acesso a dados em porto de administração web, mesmo para o Explorador de dados nas sessõs de WebAdmin
.
Por padrão, quando não chamar a função, o acesso aos dados se concede sempre no porto de administração web para uma sessão com privilégio WebAdmin
utilizando o Explorador de Dados. Em algumas configurações, por exemplo, quando o servidor de aplicações estiver alojado em uma máquina de terceiros, é possivel que não quiser que o administrador possaa ver seus dados, mesmo que possa editar a configuração do servidor, incluindo a configuração da access key.
Neste caso, pode chamar a esta função para desabilitar o acesso aos dados do Explorador de Dados no porto de administração web da máquina, mesmo se a sessão de usuário tiver o privilégio WebAdmin
. Quando esta função for executada, o arquivo de dados é protegido imediatamente e o estado é armazenado no disco: o arquivo de dados é protegido mesmo se a aplicação for restaurada.
Exemplo
Se criar um método projeto protectDataFile para chamar antes dos lançamentos, por exemplo:
ds.setAdminProtection(True) //Desativa o acesso aos dados do Explorador de Dados
See also
.setRemoteContextInfo()
Histórico
Versão | Mudanças |
---|---|
v19 R5 | Adicionado |
.setRemoteContextInfo( contextName : Text ; dataClassName : Text ; attributes : Text {; contextType : Text { ; pageLength : Integer}})
.setRemoteContextInfo( contextName : Text ; dataClassName : Text; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )
.setRemoteContextInfo( contextName : Text ; dataClassObject : 4D. DataClass ; attributes : Text {; contextType : Text { ; pageLength : Integer }})
.setRemoteContextInfo( contextName : Text ; dataClassObject : 4D. DataClass ; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )
Parameter | Type | Descrição | |
---|---|---|---|
contextName | Texto | -> | Name of the context |
dataClassName | Texto | -> | Name of the dataclass |
dataClassObject | 4D.DataClass | -> | dataclass object (e.g datastore. Employee) |
attributes | Texto | -> | Attribute list separated by a comma |
attributesColl | Coleção | -> | Collection of attribute names (text) |
contextType | Texto | -> | If provided, value must be "main" or "currentItem" |
pageLength | Integer | -> | Page length of the entity selection linked to the context (default is 80) |
Advanced mode: This function is intended for developers who need to customize ORDA default features for specific configurations. In most cases, you will not need to use it.
Descrição
The .getRemoteContextInfo()
functionreturns an object that holds information on the contextName optimization context in the datastore..
When you pass a context to the ORDA class functions, the REST request optimization is triggered immediately:
- the first entity is not fully loaded as done in automatic mode
- pages of 80 entities (or
pageLength
entities) are immediately asked to the server with only the attributes in the context
For more information on how optimization contexts are built, refer to the client/server optimization paragraph
In contextName, pass the name of the optimization context to link to the dataclass attributes.
To designate the dataclass that will receive the context, you can pass a dataClassName or a dataClassObject.
To designate the attributes to link to the context, pass either a list of attributes separated by a comma in attributes (Text), or a collection of attribute names in attributesColl (collection of text).
If attributes is an empty Text, or attributesColl is an empty collection, all the scalar attributes of the dataclass are put in the optimization context. If you pass an attribute that does not exist in the dataclass, the function ignores it and an error is thrown.
You can pass a contextType to specify if the context is a standard context or the context of the current entity selection item displayed in a list box:
- If set to "main" (default), the contextName designates a standard context.
- If set to "currentItem", the attributes passed are put in the context of the current item. See Entity selection-based list box.
In pageLength, specify the number of dataclass entities to request from the server.
You can pass a pageLength for a relation attribute which is an entity selection (one to many). The syntax is relationAttributeName:pageLength
(e.g employees:20).
Exemplo 1
var $ds : 4D. DataStoreImplementation
var $persons : cs. PersonsSelection
var $p : cs. PersonsEntity
var $contextA : Object
var $info : Object
var $text : Text
// Open remote datastore
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
// Set context info
$contextA:=New object("context"; "contextA")
$ds.setRemoteContextInfo("contextA"; $ds. Persons; "firstname, lastname")
// Send requests to the server using a loop
$persons:=$ds. Persons.all($contextA)
$text:="" For each ($p; $persons)
$text:=$p.firstname + " " + $p.lastname End for each
// Check contents of the context
$info:=$ds.getRemoteContextInfo("contextA")
// $info = {name:"contextA";dataclass:"Persons";main:"firstname, lastname"}
This example serves as a demonstration, it is not meant for real implementation.
Exemplo 2
The following piece of code requests pages of 30 entities of the Address
dataclass from the server. The returned entities only contain the zipCode
attribute.
For each Address
entity, 20 Persons entities are returned, and they only contain the lastname
and firstname
attributes:
var $ds : 4D. DataStoreImplementation
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
$ds.setRemoteContextInfo("contextA"; $ds. Address; "zipCode, persons:20,\
persons.lastname, persons.firstname"; "main"; 30)
Example 3 - Listbox
// When the form loads Case of
: (Form event code=On Load)
Form.ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
// Set the attributes of the page context
Form.ds.setRemoteContextInfo("LB"; Form.ds. Persons; "age, gender,\
children"; "currentItem")
Form.settings:=New object("context"; "LB")
Form.persons:=Form.ds. Persons.all(Form.settings)
// Form.persons is displayed in a list box End case
// When you get the attributes in the context of the current item: Form.currentItemLearntAttributes:=Form.selectedPerson.getRemoteContextAttributes()
// Form.currentItemLearntAttributes = "age, gender, children"
See also
.getRemoteContextInfo()
.getAllRemoteContexts()
.clearAllRemoteContexts()
.startRequestLog()
Histórico
Versão | Mudanças |
---|---|
v17 R6 | Adicionado |
.startRequestLog()
.startRequestLog( file : 4D.File )
.startRequestLog( reqNum : Integer )
Parameter | Type | Descrição | |
---|---|---|---|
file | 4D.File | -> | File object |
reqNum | Integer | -> | Número de petiçõs a manter em memória |
Descrição
A função .startRequestLog()
inicia o registro das petições ORDA do lado do cliente.
Esta função deve ser chamada em um 4D remoto, do contrário não faz nada. Foi criado para depuração em configurações de cliente/servidor.
O registro de petições ORDA pode ser enviado a um arquivo ou a memória, dependendo do tipo de parâmetro:
- Se passar um objeto file criado com o comando
File
, os dados de registro se escrevem neste arquivo como uma coleção de objetos (formato JSON). Cada objeto representa uma petição.
Se o arquivo não existir, será criado. No caso contrário, ou seja, se o arquivo já existir, os novos dados de registro serão adicionados a ele. Se chamar a.startRequestLog( )
com um arquivo enquanto se iniciou previamente um registro na memória, o registro em memória para e é esvaziado.
Deve adicionar manualmente um caractere \N ao final do arquivo para realizar uma validação JSON
Se passar um inteiro reqNum, se esvazia o registro em memória (se houver) e se inicializa um novo registro. Vai manter reqNum petições em memória até que se alcance o número, em cujo caso se esvaziam as entradas mais antigas (pilha FIFO).
Se chamar a.startRequestLog()
com um reqNum enquanto tiver iniciado previamente um registro em um arquivo, se para o registro do arquivo.Se não tiver passado nenhum parâmetro, o registro se inicia na memória. Se chamou previamente a
.startRequestLog()
com um reqNum (antes de um.stopRequestLog()
), os datos do registro são empilhados em memória até a próxima vez que se esvazie o registro ou se chame a.stopRequestLog()
.
Para uma descrição do formato do registro de petições de ORDA, consulte a seção Perguntas do cliente ORDA.
Exemplo 1
Se quiser registras as petições dos clientes ORDA em um arquivo e usar o número de sequencia do registro:
var $file : 4D.File
var $e : cs.PersonsEntity
$file:=File("/LOGS/ORDARequests.txt") //pasta logs
SET DATABASE PARAMETER(Client Log Recording;1) //ativar o número de sequencia logs global ds.startRequestLog($file)
$e:=ds.Persons.get(30001) //envia uma petição
ds.stopRequestLog()
SET DATABASE PARAMETER(Client Log Recording;0)
Exemplo 2
Se quiser registrar as petições dos clientes ORDA na memória:
var $es : cs.PersonsSelection
var $log : Collection
ds.startRequestLog(3) //keep 3 requests in memory
$es:=ds.Persons.query("name=:1";"Marie")
$es:=ds.Persons.query("name IN :1";New collection("Marie"))
$es:=ds.Persons.query("name=:1";"So@")
$log:=ds.getRequestLog()
ALERT("The longest request lasted: "+String($log.max("duration"))+" ms")
.startTransaction()
Histórico
Versão | Mudanças |
---|---|
v18 | Adicionado |
.startTransaction() | Parameter | Type | | Descrição | | --------- | ---- | | ------------------------------- | | | | | Does not require any parameters |
Descrição
A função .startTransaction()
inicia uma transação no processo atual no banco de dados que coincide com a datastore a qual se aplica. Todas as mudanças realizadoas nas entidades do armazém de dados no processo da transação se armazenam temporariamente até que a transação se valida ou se cancela.
Se chamar a este método no armazém de dados principal (ou seja, o armazém de dados devolvido pelo comando
ds
), a transação se aplica a todas as operações realizadas no armazém de dados principal e no banco de dados subjacente, incluindo portanto ORDA e as linguagens clássicas.
Pode aninhar várias transações (subtransações). Cada transação ou subtransação deve ser eventualmente cancelada ou validada. Note que se cancelar a transação principal, também se cancelam todas suas subtransações, mesmo se tiver validado individualmente mediante a função .validateTransaction()
.
Exemplo
var $connect; $status : Object
var $person : cs.PersonsEntity
var $ds : cs.DataStore
var $choice : Text
var $error : Boolean
Case of
:($choice="local")
$ds:=ds
:($choice="remote")
$connect:=New object("hostname";"111.222.3.4:8044")
$ds:=Open datastore($connect;"myRemoteDS")
End case
$ds.startTransaction()
$person:=$ds.Persons.query("lastname=:1";"Peters").first()
If($person#Null)
$person.lastname:="Smith"
$status:=$person.save()
End if
...
...
If($error)
$ds.cancelTransaction()
Else
$ds.validateTransaction()
End if
.stopRequestLog()
Histórico
Versão | Mudanças |
---|---|
v17 R6 | Adicionado |
.stopRequestLog()
| Parameter | Type | | Descrição |
| --------- | ---- | | ------------------------------- |
| | | | Does not require any parameters |
Descrição
A função .stopRequestLog()
detém qualquer registro de petições ORDA do lado do cliente (em arquivo ou na memória). É particularmente útil quando se registrar um arquivo, já que realmente fecha o documento aberto no disco.
Esta função deve ser chamada em um 4D remoto, do contrário não faz nada. Foi criado para depuração em configurações de cliente/servidor.
Exemplo
Ver exemplos .startRequestLog()
.
.validateTransaction()
Histórico
Versão | Mudanças |
---|---|
v18 | Adicionado |
.validateTransaction()
| Parameter | Type | | Descrição |
| --------- | ---- | | ------------------------------- |
| | | | Does not require any parameters |
Descrição
A função .validateTransaction()
aceita a transação que se iniciou com .startTransaction()
no nível correspondente do datastore especificado.
A função salva as mudanças nos dados do datastore que se produziram durante a transação.
Pode aninhar várias transações (subtransações). Se a transação principal for cancelada, todas suas subtransações também são canceladas, mesmo se validadas individualmente usando esta função.
Exemplo
Ver exemplos .startTransaction()
.