Encontrar

公告
· 一月 2

Cap sur 2026 !

Toute l'équipe InterSystems France vous souhaite une très belle année 2026, pleine d’élan, d’innovation et de succès !

Merci à toutes celles et ceux, clients, partenaires, collaborateurs, qui ont contribué à faire de 2025 une année riche en projets ambitieux et collaborations.

Ensemble, continuons à transformer, innover et faire bouger les lignes en 2026.

Nous sommes déjà prêts à vous accompagner pour relever vos futurs défis ! 🤝

讨论 (0)1
登录或注册以继续
文章
· 一月 2 阅读大约需 3 分钟

Exportando dados de configuração de Interoperabilidade para CSV

Ao trabalhar com a Interoperabilidade da InterSystems (Iris / Health Connect / Ensemble), os dados de configuração costumam estar distribuídos entre vários itens de produção: serviços, processos, operações, adaptadores e suas configurações.

Uma necessidade operacional ou de segurança comum é responder a perguntas como:

  • Quais interfaces fazem referência a caminhos do sistema de arquivos?
  • Onde estão configurados diretórios, compartilhamentos de rede ou caminhos absolutos?
  • É possível auditar ou documentar rapidamente essas informações em todas as minhas produções?

A utilidade ObjectScript abaixo resolve exatamente esse problema, exportando as configurações selecionadas para um arquivo CSV.

Este script:

  1. Percorre todos os namespaces existentes
  2. Consulta todos os itens de configuração de Interoperabilidade (Ens_Config.Item) em todos os namespaces
  3. Itera pelas Configurações de cada item
  4. Extrai caminhos de sistema de arquivos/URLs (valores que contêm :, /, ou \)
  5. Grava os resultados em um arquivo CSV, agrupados por Categoria
  6. Produz uma saída adequada para auditoria, que pode ser aberta no Excel ou compartilhada com as equipes de operações/segurança

Casos de uso comuns

Você deve usar esta ferramenta quando precisar:

  • 🔍 Auditar o uso do sistema de arquivos em todas as produções
  • 🛡 Revisar a exposição de segurança (caminhos locais, compartilhamentos de rede, conexões de banco de dados)
  • 📄 Documentar a configuração para migrações, atualizações ou planejamento de recuperação de desastres (DR)
  • 🔄 Comparar ambientes(DEV vs TEST vs PROD)
  • 🧹 Limpar paths legados ou não utilizados

Isso é especialmente útil em grandes instâncias com várias produções que utilizam muitas interfaces e adaptadores.

Formato de saída

O CSV gerado contém as seguintes colunas:

Namespace, Category, Item Name, Class Name, Property Name, Value

Alem disso:

  • Os itens de configuração são agrupados por Categoria
  • Apenas os caminhos de configurações relevantes são exportados — você pode alterar facilmente a lógica para exportar usando o nome da configuração (como "DSN" para conexões SQL) ou qualquer outro valor de configuração
  • Fácil de filtrar e analisar no Excel
  • Execute a ferramenta a partir do terminal e forneça o parâmetro com o caminho completo e o nome do CSV

por exemplo:

> do ##class(Test.Properties).GetData("c:\temp\loop.csv")

Exemplo de CSV gerado:

 

Notas e Dicas

  • 🧪Teste primeiro em um ambiente que não seja PROD se você não tiver certeza sobre as permissões
  • 📂 Certifique-se de que o diretório de destino existe e que é gravável pelo IRIS/Health Connect
  • 🔎 Você pode facilmente estender a lógica para:
    • Exportar propriedades adicionais
    • Filtrar por categoria ou classe
    • Mascarar valores sensíveis (senhas)
    • Alterar a lógica para dados relevantes

Se você estender ou melhorar a ferramenta, sinta-se à vontade para compartilhar suas melhorias com a comunidade.

讨论 (0)1
登录或注册以继续
文章
· 一月 2 阅读大约需 5 分钟

API nativa para Demos ObjectScript

A demo é baseada nas descrições brutas das classes.
As classes de dados utilizadas são Address, Person, Employee e Company.
Para uma demonstração mais atraente, foi adicionado um método JSONtoString por ID.

Após a instalação com o ZPM, basta executar pelo Terminal

USER>do ##class(ONAPI.demo).Run()
Adjust Parameters
host[127.0.0.1]:
port[1972]:
namespace[USER]:
user[_SYSTEM]:
pwd[SYS]:
timeout[5]:
****** connected ********

Em seguida, você recebe uma lista de possíveis ações de demonstração.
Nenhuma entrada significa nenhuma ação.
O menu fica em loop até você sair.

Populate Person by:100
     100
Populate Company by:10
     10
Populate Employee by:50
     50
Show Person by ID:3
{
  "Name":"O'Donnell,Mark I.",
  "SSN":"871-87-4555",
  "DOB":"1934-05-24",
  "Home":{
    "Street":"3012 Elm Drive",
    "City":"Ukiah",
    "State":"IN",
    "Zip":"11758"
  },
  "Office":{
    "Street":"1326 Maple Street",
    "City":"Jackson",
    "State":"MD",
    "Zip":"61987"
  },
  "FavoriteColors":[
    "Green"
  ],
  "Age":91
}
Show Company by ID:3
{
  "Name":"TeleData Gmbh.",
  "Mission":"Experts in innovative nano-connectivity for social networks.",
  "TaxID":"E4116",
  "Revenue":33297336,
  "Employees":[
    {
      "Name":"Larson,Dave G.",
      "SSN":"761-57-3123",
      "DOB":"2011-09-28",
      "Home":{
        "Street":"6346 Second Street",
        "City":"Chicago",
        "State":"NJ",
        "Zip":"16814"
      },
      "Office":{
        "Street":"6702 Clinton Drive",
        "City":"Tampa",
        "State":"CT",
        "Zip":"91275"
      },
      "Spouse":{
        "Name":"Willeke,Rhonda A.",
        "SSN":"434-63-3541",
        "DOB":"1974-02-15",
        "Home":{
          "Street":"1910 Oak Blvd",
          "City":"St Louis",
          "State":"ND",
          "Zip":"62884"
        },
        "Office":{
          "Street":"5148 Ash Court",
          "City":"St Louis",
          "State":"DE",
          "Zip":"36764"
        },
        "FavoriteColors":[
          "White",
          "Yellow"
        ],
        "Age":51
      },
      "FavoriteColors":[
        "Black"
      ],
      "Age":14,
      "Title":"Product Specialist",
      "Salary":28870
    },
    {
      "Name":"Quincy,Mo V.",
      "SSN":"345-36-6735",
      "DOB":"1945-05-14",
      "Home":{
        "Street":"399 Oak Court",
        "City":"Youngstown",
        "State":"LA",
        "Zip":"75634"
      },
      "Office":{
        "Street":"6307 Clinton Avenue",
        "City":"Oak Creek",
        "State":"NH",
        "Zip":"85911"
      },
      "Spouse":{
        "Name":"Iacobelli,Barb E.",
        "SSN":"951-91-9488",
        "DOB":"2020-09-04",
        "Home":{
          "Street":"8413 Elm Blvd",
          "City":"Denver",
          "State":"ID",
          "Zip":"91025"
        },
        "Office":{
          "Street":"4276 Oak Court",
          "City":"Oak Creek",
          "State":"ID",
          "Zip":"20879"
        },
        "Age":5
      },
      "FavoriteColors":[
        "Blue"
      ],
      "Age":80,
      "Title":"Global Sales Rep.",
      "Salary":89381
    }
  ]
}
Show Employee by ID:103
{
  "Name":"Larson,Dave G.",
  "SSN":"761-57-3123",
  "DOB":"2011-09-28",
  "Home":{
    "Street":"6346 Second Street",
    "City":"Chicago",
    "State":"NJ",
    "Zip":"16814"
  },
  "Office":{
    "Street":"6702 Clinton Drive",
    "City":"Tampa",
    "State":"CT",
    "Zip":"91275"
  },
  "Spouse":{
    "Name":"Willeke,Rhonda A.",
    "SSN":"434-63-3541",
    "DOB":"1974-02-15",
    "Home":{
      "Street":"1910 Oak Blvd",
      "City":"St Louis",
      "State":"ND",
      "Zip":"62884"
    },
    "Office":{
      "Street":"5148 Ash Court",
      "City":"St Louis",
      "State":"DE",
      "Zip":"36764"
    },
    "FavoriteColors":[
      "White",
      "Yellow"
    ],
    "Age":51
  },
  "FavoriteColors":[
    "Black"
  ],
  "Age":14,
  "Title":"Product Specialist",
  "Salary":28870
}
Show Global PersonD by ID:4
     $Data()=1
     Value=$lb("","Eastman,Mary C.","887-18-3730",44711,$lb("3889 Ash Blvd","Washington","TX",67862),$lb("5709 Oak Blvd","Chicago","IL",30845),"","")

Index list for Person & Employee (n,y):y
     $Employee
     $Person
     NameIDX
     SSNKey
     ZipCode
Exit Demo (n,y,*):y
****** done ********
 
USER>

GitHub

讨论 (0)1
登录或注册以继续
文章
· 一月 2 阅读大约需 3 分钟

Como encontrar um texto específico em ObjectScript

Você provavelmente conhece essa situação:

Algum tempo atrás, você encontrou uma função $ZU muito especial para um tipo de problema bem específico. Uma espécie de fórmula mística. Ela se tornou popular e foi usada por muitos desenvolvedores em todo o seu código e em todas as suas instalações.

Depois de várias versões e atualizações, você é informado pela ISC de que seu $ZU místico está obsoleto (deprecated) e não é mais suportado. Você é aconselhado a substituí-lo por um novo $something().

Então, como encontrar e documentar o uso desse código misterioso?
Ele pode estar localizado em classes, em código MAC, INT ou INC.
Também pode estar espalhado por vários namespaces.
No passado, o Studio ainda não estava completo: era pouco adequado, lento e impreciso.

Já me deparei com essa situação mais de uma vez em diferentes instalações.
O controle de versão (Source Control) não estava disponível na época e só passou a ser usado raramente quando foi finalmente introduzido.

Como ObjectScript era a única escolha possível para enfrentar esse desafio, escrevi meu próprio utilitário.
Minha solução evoluiu ao longo dos anos e, quando a migração para o IRIS foi planejada, verifiquei mais uma vez o quanto ela ainda era útil.
E, por ter sido escrita inteiramente em ObjectScript puro, ela funcionou no IRIS sem que fosse necessário alterar um único caractere.

Como você já deve saber, o problema de procurar um trecho específico de texto em ObjectScript não mudou.

Meus objetivos pessoais para esse utilitário foram:

  • apenas ObjectScript
  • nada de construções sofisticadas, milagrosas ou frágeis
  • o menor uso possível de funções $avançadas
  • priorizar legibilidade em vez de elegância, pensando na manutenção futura
  • exibir o número de ocorrências encontradas por namespace e por elemento de código
  • para classes, também distinguir entre:
    • parâmetros
    • propriedades (se calculadas)
    • métodos
    • índices
  • uma opção para mostrar a linha que contém a ocorrência
  • nenhuma preocupação com a listagem de saída:
    • qualquer programa de terminal pode gravar um log
    • o bash tem o STDOUT exatamente para isso

Esse utilitário, portanto, está disponível para você no Open Exchange e no GitHub.
Também criei um video para demonstrar a ferramenta em funcionamento.
Ela também está disponível no Demo Server.

Basta iniciá-la pelo terminal:
user>DO ^rcc.find

  • qual texto você está procurando?
  • Verbose?
  • você quer ver cada linha completa que contém o texto?
    • aviso: isso pode gerar uma listagem muito grande
    • um teste recente encontrou mais de 90.000 ocorrências
    • com verbose=1, você terá mais de 90.000 linhas
  • Apenas maiúsculas (Uppercase only)?
    • isso resolve o problema de funções escritas
      em maiúsculas, minúsculas ou em formato misto
    • Uppercase=1 garante que você não perca nenhuma ocorrência
  • Qual tipo de código você deseja examinar? (CLS, MAC, INT, INC, ALL)
  • Qual namespace você deseja pesquisar?
    • um namespace específico da sua lista ou ALL
    • para ALL, você obtém uma lista condensada de namespaces e tipos
      (não visível no vídeo)

Selecionar o namespace inicia a varredura.

Vamos dançar! 

USER> do ^rcc.find
----------------

enter search string [$ZU] <blank> to exit: RCC
          Verbose? (0,1) [0]:
          Force UpperCase? (1,0) [1]:

enter code type (CLS,MAC,INT,INC,ALL) [ALL]: CLS

select namespace (ALL,%SYS,DOCBOOK,ENSDEMO,ENSEMBLE,SAMPLES,USER) [USER]:

** Scan Namespace: USER **

** CLS **
** 2      User.ConLoad
** 15     User.Main
** 3      csp.form
** 3      csp.winner
** 2      dc.rcc.Contest
** 37     dc.rcc.Main
** 1      dc.rcc.Prize
** 63 CLS **
----------------

Espero que você tenha gostado da minha história.
Tentei evitar listagens de código entediantes, é para isso que servem o Open Exchange e o GitHub.

讨论 (0)1
登录或注册以继续
问题
· 一月 2

Accessing %Collection.ListOfObj within .NET using the Native SDK

I am migrating from HealthShare 2015 to Health Connect 2025 as part of an infrastructure upgrade. We have several C# .NET Razor web apps that interact with HealthShare using the InterSystems.Data.CacheClient assembly, and the Cache Object Binding Wizard for .NET to build the C# proxy classes. This has worked flawlessly for about 6 years.

I am now switching to using the Native SDK with the InterSystems.Data.IRISClient assembly and using the C# IRISReference and IRISObject. I have been able to rewrite nearly all the code in our web apps to use the new mechanism, with the exception of lists of objects.

As an example, I have the following Caché classes:

Class TestClasses.Entries Extends %RegisteredObject
{
Property Entries As list Of TestClasses.Entry;
}

Class TestClasses.Entry Extends %RegisteredObject
{
Property Domain As %String;
Property Username As %String;
}

A classmethod has an output parameter of TestClasses.Entries, with a return type of %Status.

Class TestClass
{
ClassMethod Method1(output pReturn As TestClasses.Entries) As %Status
{
    Set pReturn = ##class(TestClasses.Entries).%New()
    Set tObject1 = ##class(TestClasses.Entry).%New()
    Set tObject1.Username = "user1"
    Do pReturn.Entries.Insert(tObject1)
    Set tObject2 = ##class(TestClasses.Entry).%New()
    Set tObject2.Username = "user2"
    Do pReturn.Entries.Insert(tObject2)
    Quit $$$OK
}
}

Within C# I can get the Entries object and can see the type and OREF of the Entries property.

IRISReference irisReference = new(0);
iris.ClassMethodStatusCode("TestClass", "Method1", irisReference);
IRISObject irisObject = (IRISObject)irisReference.value;
Console.WriteLine(irisObject.GetOREF())
// prints: 5@TestClasses.Entries

IRISObject irisObject2 = (IRISObject)irisObject.GetObject("Entries");
Console.WriteLine(irisObject2.GetType())
// prints: InterSystems.Data.IRISClient.ADO.IRISObject
Console.WriteLine(irisObject2.GetOREF())
// prints: 8@%Collection.ListOfObj

IRISList irisList = irisObject.GetIRISList("Entries");
Console.WriteLine(irisList.ToString());
// prints: $lb()
Console.WriteLine(irisList.GetType());
// prints: InterSystems.Data.IRISClient.ADO.IRISList

But I cannot find any way to interact with the list of Entry objects or their properties. I've tried pretty much every combination of the various IRIS C# methods that I can see and have looked through the SDK documentation. The example above is a simple version of what some of our clinical web apps do; other methods have multiple input and output parameters with large objects with nested lists of objects.

Is %Collection.ListOfObj not supported via the Native SDK, or am I just doing it wrong/missing something obvious?

2 条新评论
讨论 (2)1
登录或注册以继续