Árvore de páginas

Retorna um bloco de código para um campo de uma área de trabalho aberta.

Sintaxe

FieldWBlock( < cField >, < nWokArea > )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

cField

caractere

Indica o nome do campo que será retornado o bloco de código.

X

 

nWokArea

numérico

Indica o número da área de trabalho que será retornado o bloco de código.

X

 

Retorno

Nome

Tipo

Descrição

bRet

bloco de código

Retorna o bloco de código para o campo da área de trabalho informada.

Observações

Essa função é utilizada para retornar um bloco de código executável com o campo de uma área de trabalho especificada.

Quando o bloco de código resultante é executado sem parâmetro, recupera o valor armazenado no campo. Mas, quando executado com um valor, define esse valor no determinado campo.

Portanto, o bloco de código retornado é similar a:

cAlias = Alias( Area )
&( "{ | Valor | IIf( Valor == Nil, cAlias->Campo, cAlias->Campo := Valor ) }" )

Sendo:

Area = Parâmetro nWokArea da função FieldWBlock
cAlias = Alias correspondente ao número informado em Area
Campo = Parâmetro cField da função FieldWBlock
Valor = Valor executado no bloco de código

Se o número da área de trabalho informada for inválido ou a área de trabalho não estiver aberta, o programa será encerrado com ocorrência de erro recuperável "Work area does not exist" e retornará Nil.

Caso haja erro na criação do bloco de código, o programa será encerrado com ocorrência de erro recuperável "CodeBlock definition error" e retornará Nil.

Caso o nome informado não exista no alias aberto, o bloco de código será criado, mas ocorrerá erro na execução do mesmo.

Exemplos

O exemplo abaixo utiliza a RDD "TOPCONN", mas a função pode ser utilizada com qualquer uma das RDDs válidas.

user function test1()
  Local nHandle1 := TCLink( "MSSQL/DSN1", "127.0.0.1", 7890 )
  Local aNames   := { "MYTABLE1", "MYTABLE2" }
  Local cRDD     := "TOPCONN"
  Local aNums    := {}
  Local aStruct  := {}
  Local aBlocks  := {}
  Local aValues  := {}
  Local nNames   := 0
  Local nLen     := 0
  Local nRecs    := 0
  Local nI       := 0
  Local nJ       := 0
  Local nK       := 0
  
  nNames := Len( aNames )
  
  for nI := 1 to nNames
    // Abre a tabela em modo exclusivo criando uma área de trabalho
    DBUseArea( .T., cRDD, aNames[nI], (aNames[nI]), .F., .F. )
    
    // Pega o número da área de trabalho aberta
    AAdd( aNums, Select() )
    
    // Pega os nomes dos campos da tabela
    AAdd( aStruct, {} )
    AEval( DBStruct(), { | x |  AAdd( aStruct[nI], x[1] ) } )
    
    // Pega os blocos de código de cada campo da tabela
    AAdd( aBlocks, {} )
    nLen := Len( aStruct[nI] )
    for nJ := 1 to nLen
      AAdd( aBlocks[nI], FieldWBlock( aStruct[nI][nJ], aNums[nI] ) )
    next nJ
  next nI
  
  for nI := 1 to nNames
    // Define os valores dos registros que serão inseridos
    ASize( aValues, 0 )
    if nI == 1
      AAdd( aValues, { "AAA", 123 } )
      AAdd( aValues, { "BBB", 321 } )
    else
      AAdd( aValues, { Date() + 1, .T. } )
      AAdd( aValues, { Date() + 2, .F. } )
    endif
    nRecs := Len( aValues )
    
    // Insere os registros
    for nJ := 1 to nRecs
      (aNames[nI])->( DBAppend( .F. ) )
      
      // Faz o Eval do bloco de código informando o valor
      // Isso irá fazer a atribuição do valor ao campo
      for nK := 1 to nLen
        Eval( aBlocks[nI][nK], aValues[nI][nJ][nK] )
      next nK
      
      (aNames[nI])->( DBCommit() )
    next nJ
    
    // Vai para o primeiro registro
    (aNames[nI])->( DBGoTop() )
    
    while !(aNames[nI])->( eof() )
      // Exibe o conteúdo de cada campo do registro
      for nJ := 1 to nLen
        conout( Eval( aBlocks[nI][nJ] ) )
      next nI
      
      (aNames[nI])->( DBSkip() )
    enddo
    
    // Fecha a área de trabalho
    (aNames[nI])->( DBCloseArea() )
    
    // Apaga a tabela no SGBD
    TCDelFile( aNames[nI] )
  next nI
  
  // Desconecta
  TCUnlink( nHandle1 )
return

Veja também

  • Sem rótulos