2017-06-26 1 views
0

Tout d'abord, je dois utiliser R pour obtenir le résultat de la requête SQL de la base de données HANA, que je termine en utilisant RODBC dans Rstudio. Deuxièmement, j'ai besoin de partager mon code avec d'autres, que j'utilise shinyapps.io pour terminer.Erreur "premier argument" lors de l'utilisation de shinyapps.io, rodbc pour afficher le résultat de la requête sql dans web

Cependant, je dois utiliser shinyapps pour montrer mon résultat de la requête SQL sur d'autres ordinateurs, que j'ai le message d'erreur suivant:

error first argument is not an open rodbc channel 

J'ai utilisé la réponse de R shiny RODBC connection Failing, mais il ne fonctionne toujours pas.

Voici mes codes pour ui.R et sever.R attachés:

ui.R:

library(dplyr) 
library(RODBC) 
library(stringr) 
library(ggplot2) 
fluidPage(
    titlePanel("Basic DataTable"), 
    fluidRow(
    DT::dataTableOutput("table") 
) 
) 

sever.R:

library(dplyr) 
library(RODBC) 
library(stringr) 
library(ggplot2) 
ch<-odbcConnect('HANARB1P',uid='****',pwd='****') 
options(scipen = 200) 
myOffice <- 0 
StartDate <- 20170601 
EndDate <- 20170610 
office_clause = "" 
if (myOffice != 0) { 
    office_clause = paste(
    'AND "_outer"."/BIC/ZSALE_OFF" IN (',paste(myOffice, collapse=", "),')' 
) 
} 
function(input, output) { 
    output$table <- DT::renderDataTable(DT::datatable({ 
    data <- sqlQuery(channel=ch,query=paste(' SELECT TOP 100 
                "/BIC/ZSALE_OFF" AS "SalesOffice", 
                "/BIC/ZHASHPAN" AS "CreditCard" 
              FROM "SAPB1P"."/BIC/AZ_RT_A212" 
              WHERE "CALDAY" BETWEEN',StartDate,'AND',EndDate,' 
                ',office_clause,' 
           ')) 
    data 
    })) 

}

pourrait quelqu'un s'il vous plaît aidez-moi ici? Comment utiliser shinyapps.io et RODBC pour afficher le résultat de la requête SQL sur les pages Web à partager? Selon la réponse, j'ai révisé un peu mon code. Mais sth weired arrive à nouveau. Lorsque j'utilise le code:

function(input, output) { 
    output$table <- DT::renderDataTable(DT::datatable({ 
    data <- sqlQuery(channel=ch,query=paste(' SELECT TOP 50 
               "/BIC/ZSALE_OFF" AS "SalesOffice", 
                "/BIC/ZHASHPAN" AS "CreditCard" 
               FROM "SAPB1P"."/BIC/AZ_RT_A212" 
               WHERE "CALDAY" BETWEEN',StartDate,'AND',EndDate,' 
                ',office_clause,' 
              ')) 
    data 
    })) 
} 

Je les informations d'erreur:

enter image description here

Quand j'utiliser le code:

shinyServer(
function(input, output) { 
    data <- sqlQuery(channel=ch,query=paste(' SELECT TOP 50 
               "/BIC/ZSALE_OFF" AS "SalesOffice", 
                "/BIC/ZHASHPAN" AS "CreditCard" 
               FROM "SAPB1P"."/BIC/AZ_RT_A212" 
               WHERE "CALDAY" BETWEEN',StartDate,'AND',EndDate,' 
                ',office_clause,' 
              ')) 
    output$table <- DT::renderDataTable(data) 
} 
) 

Je les informations d'erreur:

enter image description here

Je suis sûr que la chaîne fonctionne. Si je viens d'utiliser l'application run pour ce faire:

shiny::runApp('//paper/fchen4/feng.officeworks/mycode/myShiny') 

Cela fonctionne très bien. Mais je travaille dans une entreprise, je ne sais pas si le pare-feu ou sth pourrait avoir sth à faire avec cette erreur. Mais si je n'utilise pas SQL ici, c'est OK

Quelqu'un peut-il m'aider s'il vous plaît ici?

Répondre

2

Eh bien, avez-vous vérifié que le canal est réellement ouvert? Le message d'erreur peut être le résultat d'informations d'identification incorrectes, d'un serveur inaccessible ou de toute autre information susceptible d'empêcher le succès d'une connexion SQL.

J'ai eu aucun problème montrant le contenu de la table avec le code suivant:

ui.R

library(shiny) 

# Define UI for application that draws a histogram 
shinyUI(fluidPage(

    # Application title 
    titlePanel("Basic Data Table"),  
    fluidRow(
     dataTableOutput("table") 
    ) 
)) 
Serveur

.R

library(shiny) 
library(RODBC) 

ch <- odbcConnect("S12") 

# Define server logic to provide table output 
shinyServer(
    function(input, output) { 

     query_result <- sqlQuery(channel = ch, query = 'SELECT * FROM M_DATABASE') 
     output$table <- renderDataTable(query_result) 
    } 
) 

Il n'y a aucune raison d'appeler DT::datatable() autour du résultat de la requête SQL comme il retourne déjà une trame de données qui peut être introduit dans renderDataTable().

Quelques conseils généraux:

  • jamais mettre vos données de connexion dans le code d'application. Dans SCN Blog "HANA quick note – checking my connections and using them securely …", j'ai expliqué comment stocker et utiliser en toute sécurité les données de connexion et d'ouverture de session pour les systèmes SAP HANA. Cela vous donne également un moyen très simple de vérifier la connectivité à votre instance HANA. En outre, pointer simplement vers la connexion ODBC DSN au lieu de fournir tous les paramètres semble beaucoup plus propre.

  • Vous n'avez pas besoin de toutes les bibliothèques de R dans le fichier ui.R que le code qui utilise des bibliothèques comme RODBC est dans le fichier server.R. Assurez-vous d'avoir les bibliothèques minimales requises dans chaque fichier pour vous faciliter la vie. Cela ne fait pas de mal de rompre les longs appels de paramètres de fonction imbriqués comme je l'ai fait avec votre "appel-SQL-instruction-convertir-resultset-data-type-feed-it-dans-rendre-fonction". Il est beaucoup plus facile de suivre ce qui se passe où et ce qui échoue où, quand il n'y a pas trop de commandes dans une seule ligne.

Ceci devrait fonctionner pour vous.

+0

Merci beaucoup pour la réponse de Lars Br. Mais j'ai toujours un problème. Je vais cacher mes informations de connexion à l'étape suivante. Je suis sûr que le canal fonctionne parce que quand j'utilise shiny :: runApp ('// paper/fchen4/feng.officeworks/mycode/myShiny'), ça va. Pourriez-vous s'il vous plaît jeter un oeil ici encore? J'ajoute de nouveaux commentaires en fonction de votre réponse dans ma question –

+0

Je pense que vous devez d'abord vous assurer que la connectivité entre le serveur SHINY et HANA fonctionne. Les DSN ODBC comme votre 'HANARB1P' dépendent généralement de l'utilisateur du système d'exploitation. Ainsi, si la partie serveur SHINY s'exécute sur une machine différente et/ou un utilisateur différent, ce DSN doit également être configuré pour cet utilisateur. –

+0

J'utilise shinyapps.io basé sur le manuel de https://www.shinyapps.io/. Je pense qu'il fonctionne sur une machine différente. Mais je ne comprends pas ce que vous voulez dire un utilisateur différent? J'ai vu quelques informations sur odbcDriverConnect comme https://support.rstudio.com/hc/en-us/articles/225408367-Connecting-to-databases-using-RODBC-on-shinyapps-io. Pensez-vous que je devrais essayer odbcDriverConnect? –