Sim, é possível, dentro de um Variant pode ser colocado um novo SafeArray (existem os métodos SetSafeArray e GetSafeArray na classe Variant), portanto a estrutura é ilimitada, quantos níveis vc quiser. Quanto ao erro, seu parâmetro é String? Se for, pode estar faltando a definição do tamanho do buffer com a função SalStrSetBufferLength. Esse erro exatamente eu nunca tive.

Sds,
Erasmo


On 27/3/2009 12:51, Claudio Augusto Felix Pinto wrote:

Erasmo,

Muito obrigado pelo retorno, já me deu uma luz para resolver o problema. No entanto, ao implementar sua sugestão, acabei me deparando com outro problema que ocorre mesmo em chamadas com parâmetros simples. Estranho que sempre consegui executar a DLL com parâmetros simples, mas agora estou recebendo a mensagem "Reference to null user defined variable". Talvez quem gerou essa DLL fez alguma definição diferente do que havia nas outras em que eu trabalhei anteriormente com sucesso. Estou tentando resolver primeiro esse problema para depois voltar a testar usando parâmetros do tipo estrutura.

Erasmo, eu observei que você me deu um exemplo de dado estruturado onde cada item da estrutura é uma estrutura simples. Seria possível implementar em Centura quando um dos itens da estrutura é uma outra estrutura como uma tabela, por exemplo? Na DLL que eu quero acessar geralmente no seu parâmetro de retorno um dos itens da estrutura é uma tabela, ou seja, é uma outra estrutura de dado, que por sua vez pode ter um item que é ele também uma outra tabela. Isso é possível de implementar no Centura?

Caso não seja possível, a alternativa que pensei é fazer a chamada e a DLL colocaria os dados estruturados do parâmetro de retorno em tabelas temporárias do banco de dados, através das quais o Centura obteria o retorno.

Atenciosamente,

Claudio Augusto

------------------------------------------------------------------------

*De:* owner-sql...@virtualand.net [mailto:owner-sql...@virtualand.net] *Em nome de *Erasmo
*Enviada em:* quinta-feira, 26 de março de 2009 14:35
*Para:* sqlwin@virtualand.net
*Assunto:* Re: [sqlwin] Passagem de Estruturas entre o Centura e uma DLL

Cláudio,

Crie um objeto/variável do tipo SafeArray, execute os métodos Create e Put (específicos para cada tipo) e utilize na função de sua DLL, por exemplo:

!!CB!! 134
Function: Teste
    Description:
    Returns
    Parameters
    Static Variables
    Local variables
        : saArray
            Class: SafeArray
        : vItem1
            Class: Variant
        : vItem2
            Class: Variant
        : vItem3
            Class: Variant
    Actions
        ! Cria um SafeArray de Objetos com três posições
        Call saArray.Create( VT_VARIANT, 3, 0 )
        ! Seta o primeiro elemento, indice 0 - exemplo: Number
        Call vItem1.SetNumber( 10, VT_I2 )
        Call saArray.PutVariant( vItem1, 0 )
        ! Seta o segundo elemento, indice 1 - exemplo: String
        Call vItem2.SetString( "teste" )
        Call saArray.PutVariant( vItem2, 1 )
        ! Seta o terceiro elemento, indice 2 - exemplo: Date
        Call vItem2.SetDate( SalDateCurrent(  ) )
        Call saArray.PutVariant( vItem3, 2 )
        ! Usa na chamada da DLL
        Call MinhaDll (saArray)

Sds,
Erasmo

--
Erasmo Bispo de Oliveira Junior
Gerente de Pesquisa e Desenvolvimento
Softway - Softcomex Informática Ltda.
Pabx: +55 (19) 3344.9200
Direto:+55 (19) 3344.9361
Fax: +55 (19) 3344.9240
e-mail: erasmo.olive...@sfw.com.br <mailto:erasmo.olive...@sfw.com.br>
web: http://www.softcomex.com.br

Antes de imprimir esta mensagem, pense em sua responsabilidade e compromisso com o meio ambiente!



On 26/3/2009 12:45, Claudio Augusto Felix Pinto wrote:

Antes de mais nada queria compartilhar a minha satisfação em poder participar desse seleto grupo, agora que consegui a inscrição no mesmo. Nessa minha primeira postagem, uma dúvida sobre tipo de dado estruturado no Centura 2.0.

Amigos, abri uma DLL feita em VB no Centura 2.0 usando o "ActiveX Explorer" do centura. O Centura gerou a APL com os métodos definidos na DLL (ou melhor, na TLB). Um dos métodos retorna uma estrutura composta (tipo registro) de itens simples (como um numérico) e complexos (como uma tabela). Ao gerar a "Functional Class" para esse método, o Centura definiu esse parâmetro (que retorna uma estrutura de registro) como sendo do tipo "SafeArray".

Ocorre que, até onde eu entendo, o SafeArray me pareceu ser um array de um tipo de dado simples, e não um array de uma estrutura. Me pareceu ser assim porque uma vez declarada a variável X como sendo do tipo ArraySafe, eu preciso chamar o create dela: X.Create(p1, p2, p3), no qual o parâmetro p1 vai definir o tipo de dado do Safearray. Olhando o help do centura, em "Data type mappings", verifiquei que os tipos de dados suportados são sempre tipos simples. Não vi nenhuma opção que suporte uma estrutura.

A propósito, também não sei se o centura suporta a criação de um tipo de dado estruturado (ou tipo registro) em form. Quando tentei usar StructPoint na sessão "Variables", ele não permitiu. Me parece que ele aceita o "Structpoint" apenas na sessão "External Function -> Library name". No entanto, eu precisava definir um tipo de dado estruturado no escopo do form (para usá-lo como parâmetro na chamada ao método) e não no escopo de uma função externa.

Resumindo, eu gostaria de saber se o Centura permite ou não passagem de parâmetros do tipo "Estrutura" de/para uma DLL e, em caso positivo, como eu faço para montar a estrutura desse parâmetro que o Centura definiu como sendo do tipo "SafeArray" ?

Atenciosamente,

Claudio Augusto



--
Erasmo Bispo de Oliveira Junior
Gerente de Pesquisa e Desenvolvimento
Softway - Softcomex Informática Ltda.
Pabx: +55 (19) 3344.9200
Direto:+55 (19) 3344.9361
Fax: +55 (19) 3344.9240
e-mail: erasmo.olive...@sfw.com.br
web: http://www.softcomex.com.br

Antes de imprimir esta mensagem, pense em sua responsabilidade e compromisso com o meio ambiente!

Responder a