Nueva publicación

Encontrar

Anuncio
· 11 jun, 2025

[Video] SMART on FHIR: Application Setup

Hey Community,

Enjoy the new video on InterSystems Developers YouTube:

⏯ SMART on FHIR: Application Setup

From this video, you'll learn the final setup step for configuring an application by editing specific files in a code editor (e.g., VS Code) to align with the previously configured servers.

🗣  Presenter@Tani Frankel, Sales Engineer Manager, InterSystems

Check out the related article: SMART on FHIR app - Sample with Hands-on Exercise/Workshop Instructions

Enjoy watching, and look for more videos! 👍

1 Comentario
Comentarios (1)2
Inicie sesión o regístrese para continuar
Artículo
· 11 jun, 2025 Lectura de 9 min

Integrando com Google Forms

O Google Forms é a solução mais popular no mercado para a coleta de dados, respostas a questionários e quizzes. Por isso, é a ferramenta ideal para coletar dados e respostas de pacientes de forma prática, eliminando a necessidade de expandir ou desenvolver sistemas complexos.

Neste artigo, vou detalhar como criar uma conta no Google Cloud, registrar a aplicação que irá consumir a API do Google Forms, gerar o usuário de serviço necessário para consumir a API e, por fim, realizar ações para criar novos formulários e coletar os dados preenchidos neles de forma automatizada em Python e IRIS embutido.

Crie Sua Conta Google Cloud

Se você ainda não tem uma conta Google Cloud, siga estes passos. Caso contrário, vá para a próxima seção.
Para criar uma conta no Google Cloud Platform (GCP), você primeiro precisa de uma conta Google. Depois, você pode fazer login no console do Google Cloud e começar a usar o nível gratuito ou criar uma conta paga. Veja um guia passo a passo:

1.   Acesse o console do Google Cloud: Visite cloud.google.com.
2.    Faça login com sua conta Google: Se você não tiver uma, precisará criar uma.
3.    Aceite os termos e condições: Revise e aceite os termos e condições do Google Cloud.
4.    Comece Gratuitamente ou Crie uma Conta de Faturamento:
a.   Nível Gratuito: Você pode começar a usar o Google Cloud gratuitamente com o nível gratuito
b.   Conta Paga: Se precisar de mais recursos ou funcionalidades avançadas, você precisará criar uma conta de faturamento.
5.    Crie uma Conta de Faturamento (se necessário): Se você optar por criar uma conta paga, precisará configurar uma conta de faturamento, o que exige o fornecimento de detalhes de verificação de pagamento e informações sobre sua organização.
6.    Comece a Usar: Assim que sua conta estiver configurada, você poderá acessar o console do Google Cloud e começar a usar os serviços.

Criar um Projeto Google Cloud

É obrigatório criar um projeto para usar as APIs e SDKs do Google em seus programas.

Acesse este link e siga os passos:

https://developers.google.com/workspace/guides/create-project

 

Criar uma Conta de Serviço Google Cloud

É necessário criar uma conta de serviço (credenciais para aplicações) para que sua aplicação possa consumir a API do Google Forms.

1.    Acesse https://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts , e selecione o projeto que você criou na seção anterior.
2.    Clique no botão + Criar conta de serviço, preencha os campos obrigatórios e clique em Criar e continuar.
3.    Selecione a função Proprietário e clique no botão Continuar.
4 .   Salve seu arquivo JSON de credenciais para usar posteriormente.
5.    Clique no botão Concluir (Done).
6.    Clique no botão de 3 pontos e selecione Gerenciar chaves.
 
7.    Clique no botão Adicionar chave > Criar nova chave.

8.    Selecione JSON e clique em Criar.
 
9.    As credenciais são salvas na sua página de downloads. SALVE ESTE ARQUIVO PORQUE IREI USÁ-LO MAIS TARDE.

Ativar as APIs do Google Forms e do Google Drive

Para que seu projeto possa consumir as APIs do Google Forms e do Google Drive (porque o Drive armazena as definições dos formulários do Google), você deve ativar o acesso:
1.    Vá para https://console.cloud.google.com/apis/dashboard
2.    Clique no botão "+ Ativar APIs e serviços".
3.    Pesquise por "Google Drive API" no campo superior "Pesquisar APIs e serviços", selecione "Google Drive API" e ative a API, se ainda não estiver ativada.
4.    Repita o passo 3 e pesquise por Google Forms API no campo superior "Pesquisar APIs e serviços", selecione Google Forms API e ative a API, se ainda não estiver ativada.


Obtenha e Execute o Projeto health-gforms 

Criei uma aplicação de exemplo (health-gforms em https://openexchange.intersystems.com/package/health-gforms) que cria um Google Form e coleta dados dele.


1.    Clone/faça um git pull do repositório em qualquer diretório local.
$ git clone https://github.com/yurimarx/health-gforms/health-gforms.git
2.    Abra o terminal neste diretório e execute:
$ docker-compose build
$ docker-compose up -d

 

Usando a API health-gforms via Postman


1.    Baixe (https://www.postman.com/downloads/) e instale o aplicativo Postman, se você ainda não o tiver.
2.    Baixe a coleção Postman em https://github.com/yurimarx/health-gforms/raw/refs/heads/master/health-g...
3.    Importe esta coleção para o seu Postman:
 
4.    Clique em "1. Post credentials" para carregar as credenciais da conta de serviço do Google Cloud para sua instância Docker:
 
5.    Abra "2. Post form definition" para salvar a definição do formulário (use um arquivo da pasta raiz do projeto, formpatient.json) em sua instância Docker
 
6.    Clique em "3. Create form from file definition" para criar um novo formulário Google no Google Cloud e coletar dados sobre um novo paciente: 
7.    Copie o valor para formId: 
8.    Abra os Formulários Google usando seu navegador (preste atenção ao valor de formId, eu o usei no caminho: https://docs.google.com/forms/d/1DtqV5edXVOjM-FAntPffRHqfVjMjOIJuiq5VXBc...
 
9.    Para preencher os Formulários Google como usuário final, vá até o botão "participant link" e cole em uma nova aba do navegador: 
10.    Preencha o formulário como usuário final:
 
11.    Cole as respostas do formulário.

12. Clique em "4. Get form content from template" e mude o valor de formId para o formId fornecido na etapa 7: 
13.    Clique no botão enviar e veja o conteúdo JSON FHIR para enviar ao seu servidor FHIR:

 

Nos Bastidores

Criando um Formulário nos Formulários Google:

ClassMethod CreateFormFromFile(formtitle As %String, filepath As %String) [ Language = python ]
{
    
    import httplib2
    import json
    from oauth2client.service_account import ServiceAccountCredentials
    from googleapiclient.discovery import build
    from mako.template import Template

    
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        "/opt/irisapp/credentials.json",
        scopes=["https://www.googleapis.com/auth/forms.body", 
                "https://www.googleapis.com/auth/forms", 
                "https://www.googleapis.com/auth/drive", 
                "https://www.googleapis.com/auth/drive.file"],
    )

    http = httplib2.Http()
    http = credentials.authorize(http)

    form_service = build("forms", "v1", http=http)

    new_form_template = Template('{"info": {"title": "${title}"}}')
    new_form_str = new_form_template.render(title=formtitle)
    NEW_FORM = json.loads(new_form_str)

    # Create the form
    try:
        result = form_service.forms().create(body=NEW_FORM).execute()
        formid = result["formId"]
        print(f'Form created: {result}')

        with open(filepath) as file:
            itemsjson = json.loads(file.read())
            # Adds form items
            items = (
                form_service.forms()
                .batchUpdate(formId=formid, body=itemsjson)
                .execute()
            )

        permission2 = {
            'type': 'anyone',
            'role': 'writer',
        }

        drive_service = build('drive', 'v3', credentials=credentials)

        drive_service.permissions().create(fileId=formid, body=permission2).execute()

        return formid
    except Exception as e:
        print(f'Error creating form: {e}')
}

1. Nós criamos as credenciais usando os dados da conta de serviço dentro de um arquivo JSON de credenciais para as APIs de formulários e drive.

2. Nós usamos essas credenciais para construir um form_service.

3. O form_service é usado para criar o Formulário Google apenas com o cabeçalho.

4. O form_service lê o arquivo formpatient.json para criar os itens do formulário (campos ou perguntas). Veja o conteúdo deste arquivo:

{
    "requests": [
        {
            "createItem": {
                "item": {
                    "title": "Given Name",
                    "questionItem": {
                        "question": {
                            "required": true,
                            "textQuestion": {}
                        }
                    }
                },
                "location": {"index": 0}
            }
        },
        {
            "createItem": {
                "item": {
                    "title": "Family Name",
                    "questionItem": {
                        "question": {
                            "required": true,
                            "textQuestion": {}
                        }
                    }
                },
                "location": {"index": 1}
            }
        },
        {
            "createItem": {
                "item": {
                    "title": "Gender",
                    "questionItem": {
                        "question": {
                            "required": true,
                            "choiceQuestion": {
                                "type": "RADIO",
                                "options": [
                                    {
                                        "value": "male"
                                    },
                                    {
                                        "value": "female"
                                    }
                                ]
                            }
                        }
                    }
                },
                "location": {"index": 2}
            }
        },
        {
            "createItem": {
                "item": {
                    "title": "Birth Date",
                    "questionItem": {
                        "question": {
                            "required": true,
                            "dateQuestion": {
                                "includeYear": true
                            }
                        }
                    }
                },
                "location": {"index": 3}
            }
        },
        {
            "createItem": {
                "item": {
                    "title": "Phone",
                    "questionItem": {
                        "question": {
                            "required": true,
                            "textQuestion": {}
                        }
                    }
                },
                "location": {"index": 4}
            }
        }
    ]   
}

5. Agora temos um novo formulário.

Colete respostas de dados do usuário de um Formulário Google:

ClassMethod GetResponsesFromFormId(formid As %String) [ Language = python ]
{
    import httplib2
    from oauth2client.service_account import ServiceAccountCredentials
    from googleapiclient.discovery import build

    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        "/opt/irisapp/credentials.json",
        scopes="https://www.googleapis.com/auth/forms.responses.readonly",
    )

    # Create an httplib2.Http object to handle our HTTP requests and authorize
    # it with the Credentials.
    http = httplib2.Http()
    http = credentials.authorize(http)

    form_service = build("forms", "v1", http=http)

    # Prints the responses of your specified form:
    result = form_service.forms().responses().list(formId=formid).execute()
    return result
}

1. Um objeto de credencial é criado usando a conta de serviço definida em credentials.json com autorização para ler os Formulários Google.

2. Um form_service é criado a partir das credenciais.

3. O form_service é usado para obter todas as respostas de um formId.

1 Comentario
Comentarios (1)1
Inicie sesión o regístrese para continuar
Pregunta
· 11 jun, 2025

Cannot open file '/ensemble/TEST/iris.cpf_.... when trying to create a Database/Namespace

I have created a New Database/Namespace within our TEST environment on both the Primary and Backup of the mirror. When I go to create the database/namespace on the DR node I am getting "Cannot open file '/ensemble/TEST/iris.cpf_...." while the cpf file that it references does not exist. Anyone have any clue to why this might be happening?

3 comentarios
Comentarios (5)2
Inicie sesión o regístrese para continuar
Artículo
· 11 jun, 2025 Lectura de 3 min

Convertir consultas jerárquicas de Oracle a InterSystems IRIS: generar rangos de fechas

Si estáis migrando de Oracle a InterSystems IRIS, como muchos de mis clientes, podríais encontraros con patrones SQL específicos de Oracle que necesitan ser traducidos.

Tomad este ejemplo:

SELECT (TO_DATE('2023-05-12','YYYY-MM-DD') - LEVEL + 1) AS gap_date
FROM dual
CONNECT BY LEVEL <= (TO_DATE('2023-05-12','YYYY-MM-DD') - TO_DATE('2023-05-02','YYYY-MM-DD') + 1);

En Oracle:

  • LEVEL es una pseudocolumna usada en consultas jerárquicas (CONNECT BY). Comienza en 1 y se incrementa de 1 en 1.
  • CONNECT BY LEVEL <= (...) determina cuántas filas se van a generar.
  • La diferencia entre las dos fechas más uno da 11, así que la consulta produce 11 filas, contando hacia atrás desde el 12 de mayo de 2023 hasta el 2 de mayo de 2023.

Desglose del resultado:

LEVEL = 1  → 2023-05-12
LEVEL = 2  → 2023-05-11
...
LEVEL = 11 → 2023-05-02

Ahora la pregunta es: ¿Cómo conseguís esto en InterSystems IRIS, que no admite CONNECT BY?

Una solución es implementar una consulta al estilo SQL usando ObjectScript que imite este comportamiento. A continuación se muestra un ejemplo de definición CREATE QUERY que acepta una STARTDATE y un número de DAYS, y devuelve la lista descendente de fechas.


✅ InterSystems IRIS: Implementación de una consulta de intervalo de fechas

CREATE QUERY GET_GAP_DATE(IN STARTDATE DATE, IN DAYS INT)
  RESULTS (GAP_DATE DATE)
  PROCEDURE
  LANGUAGE OBJECTSCRIPT

  Execute(INOUT QHandle BINARY(255), IN STARTDATE DATE, IN DAYS INT)
  {
    SET QHandle("start") = STARTDATE
    SET QHandle("days")  = DAYS
    SET QHandle("level") = 1
    RETURN $$$OK
  }

  Fetch(INOUT QHandle BINARY(255), INOUT Row %List, INOUT AtEnd INT)
  {
    IF (QHandle("level") > QHandle("days")) {
      SET Row = ""
      SET AtEnd = 1
    } ELSE {
      SET Row = $ListBuild(QHandle("start") - QHandle("level") + 1)
      SET QHandle("level") = QHandle("level") + 1
    }
    RETURN $$$OK
  }

  Close(INOUT QHandle BINARY(255))
  {
    KILL QHandle
    QUIT $$$OK
  }

Podéis ejecutar la instrucción CREATE QUERY anterior en el Portal de Gestión del Sistema de IRIS, o mediante una herramienta como DBeaver o un notebook de Python/Jupyter usando JDBC/ODBC.


🧪 Ejemplo de uso:

Para generar el mismo resultado que la consulta de Oracle anterior, usad:

SELECT * FROM GET_GAP_DATE(
  TO_DATE('2023-05-12', 'YYYY-MM-DD'),
  TO_DATE('2023-05-12', 'YYYY-MM-DD') - TO_DATE('2023-05-02', 'YYYY-MM-DD') + 1
);

Esto generará:

GAP_DATE
----------
2023-05-12
2023-05-11
...
2023-05-02
(11 rows)

🔁 Uso avanzado: Unir con otras tablas

También podéis usar esta consulta como subconsulta o en joins:

SELECT * 
FROM GET_GAP_DATE(TO_DATE('2023-05-12', 'YYYY-MM-DD'), 11) 
CROSS JOIN dual;

Esto os permite integrar rangos de fechas en flujos de trabajo SQL más amplios.


¡Espero que esto ayude a quien esté enfrentando escenarios de migración de Oracle a IRIS! Si habéis creado soluciones alternativas o tenéis mejoras, me encantaría conocer vuestras opiniones.

Comentarios (0)1
Inicie sesión o regístrese para continuar
Pregunta
· 11 jun, 2025

Mpt colleges

The Master of Physiotherapy (MPT) program at MMU Solan https://www.mmusolan.org/course/master-of-physiotherapy-mpt offers specialized training in various branches of physiotherapy, such as orthopedics, neurology, sports, and cardiopulmonary. The program emphasizes evidence-based practice, advanced clinical skills, and research. Students engage in rigorous coursework, clinical internships, and research projects, gaining proficiency in diagnosing and treating a wide range of physical conditions.

Comentarios (0)1
Inicie sesión o regístrese para continuar