Pour l'instant je récupère les données comme cela dans un DataGridView :
Dim obj As Object = JsonConvert.DeserializeObject(Of Object)(response.Content)
For i = 0 To obj.count
DGW.Rows.Add(obj.("data")(i)("user")("infoUser1"))
Next
Le problème c'est que l'API contient un total de 1125 données et ici elle ne me retourne que les 6 premiers ?
Edit : Je comptais les mauvaise données 😅
Dim obj As Object = JsonConvert.DeserializeObject(Of Object)(response.Content)
Dim jsonArray As JArray = obj("data")
For i = 0 To jsonArray.Count - 1
Dim data As JObject = jsonArray(i)
DGW.Rows.Add(data("user")("infoUser1"))
Next
Ca résout le problème :)
Après plusieurs recherche j'ai vus que beaucoup de personne passe par une classe supplémentaire
Le problème est que je ne sais pas comment organiser la classe et faire la boucle for:
Dim obj = JsonConvert.DeserializeObject(Of Name)(response.Content)
'For i = 0 To obj.count
DGW.Rows.Add(obj.infoUser1)
'Next
Public Class Name
Public infoUser1 As String
End Class
Ici il ne me retourne rien, car je pense que je ne spécifie pas la liste Data et User...
ça pourrait être dans le constructeur de ta classe que tu fais ta boucle (le constructeur ayant en paramètre la chaine correspondant au response.Content
J'hésite a laisser comme cela, car c'est une petite application qui ne sera pas amené à évoluer.
umfred a écrit:
ça pourrait être dans le constructeur de ta classe que tu fais ta boucle (le constructeur ayant en paramètre la chaine correspondant au response.Content
Merci pour ta réponse, je pense savoir comment faire :)
Sinon c'est un autre problème et j'ai pas encore commencé à réfléchir sur le sujet :
Depuis l'API je récupère des dates... Il me faut faire un compteur de date en fonction du numéros de la semaine :
Exemple
Semaine 38
je récupère : 21/09, 23/09, 25/09
Donc en Semaine 38 j'ai 3
Est ce qu'il existe un moyen simple de retrouver les numéros de semaine et les dates correspondante facilement ?
Edit :
Peut être donner une date, regarder quelle semaine et à partir de la faire le compteur...
une année c'est 52 semaines (parfois 53); donc pourquoi pas un tableau de 53 entiers, et incrémenter la case correspondant à la semaine; ou un dictionnaire dont la clé est le numéro de la semaine et la valeur, ton compteur (les 2 sont assez similaires)
Le passage par une classe supplémentaire, très probablement un DTO, permet d'isoler la couche Données de la couche Business, qui permet de très facilement changer de couche de Données.
Très pratique, même pour un petit projet, car cela permet d'avoir une couche de données pour les tests très facilement configurable/bidouillable, via des fichiers plat ou des mock, etc...
En cherchant un peu, tu devrais trouver des générateurs automatiques/proxys de ces DTO et de quoi les gérer facilement (souvent à base d'attributs .NET).
Une DataGridView et un JsonConvert dans une même méthode ? Ca sent l'application monolithique pas testable tout ça.
Pour les numéros de semaines, je ne crois pas qu'il y ait un standard international et les règles "françaises" sont assez casse-couilles (1er Mercredi de l'année, etc...). Vérifiez que ce qu'implémente le framework .NET suit les règles de votre client, qui n'est pas forcément ceux des States.
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Du coup je donne le code de l'application complet et fonctionnelle dans le but d'apprendre et de l'améliorer.
L'application récupère des données depuis une API et un fichier Excel.
Depuis l'API je récupère :
- Nom
- Lieux
- Date
Depuis le fichier Excel, je récupère :
- Zone de distance (a partir du lieux)
Une image :
Pour l'instant je n'ai fait qu'une classe qui ressemble à ceci :
Imports System.Globalization
Imports Microsoft.Office.Interop
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Imports RestSharp
Imports OleDbConnection = System.Data.OleDb.OleDbConnection
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
TextBox1.Text = DateTime.Now.ToString.Substring(6, 4)
fonctionnement()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
fonctionnement()
End Sub
Private Sub fonctionnement()
Label3.Text = "Chargement en cours"
' Variable Récupération Data API
Dim Jsonobj As Object
Dim JsonArr As JArray
' Connexion a l'API
Dim client As RestClient
Dim response As IRestResponse
Dim request = New RestRequest(Method.[GET])
request.AddHeader("Authorization", "APIKey")
' Calendrier Francais
Dim dfi = DateTimeFormatInfo.CurrentInfo
Dim calendar = dfi.Calendar
' **********************************
'Indiquer le nombre de Colonnes
' **********************************
Dim NumSemaine As Integer = 1
DGW.ColumnCount = 56
DGW.Columns(0).Name = "idUser"
DGW.Columns(1).Name = "Noms"
DGW.Columns(2).Name = "Zone"
For i = 3 To 55
DGW.Columns(i).Name = NumSemaine
NumSemaine = NumSemaine + 1
Next
' **************************************
'Récuperer tous les utilisateurs
' **************************************
client = New RestClient("URL/user")
client.Timeout = -1
response = client.Execute(request)
Jsonobj = JsonConvert.DeserializeObject(Of Object)(response.Content)
JsonArr = Jsonobj("data")
For i = 0 To JsonArr.Count - 1
Dim data As JObject = JsonArr(i)
' Ajouter 5 zones pour chaque utilisateurs
For U = 1 To 5
DGW.Rows.Add(data("id"), data("lastname"), U)
Next
Next
' ********************************
' Recupérer toutes les données : 500/500
'**********************************
client = New RestClient("URL/user")
client.Timeout = -1
response = client.Execute(request)
Jsonobj = JsonConvert.DeserializeObject(Of Object)(response.Content)
Dim totalResult As Integer = Jsonobj("total")
Dim Skip As Integer = 0
' Variable 2 dimension ligne, colonne
Dim NbrJour(DGW.Rows.Count - 1, DGW.Columns.Count - 1) As Integer
While totalResult > 0
' *************************************************************************
' Récuperation et calculs des données nbr jours travaillé/semaine/distance/personne
' *************************************************************************
client = New RestClient("URL/Mission?limit=500&skip=" + Skip.ToString)
client.Timeout = -1
response = client.Execute(request)
Dim obj As Object = JsonConvert.DeserializeObject(Of Object)(response.Content)
Dim JsonArray As JArray = obj("data")
For i = 0 To JsonArray.Count - 1
Dim data As JObject = JsonArray(i)
Dim weekOfyear As String = calendar.GetWeekOfYear(data("date"), dfi.CalendarWeekRule, DayOfWeek.Thursday)
Dim cmd As OleDbCommand
Dim cn As OleDbConnection
Dim zone As String
Dim ExcelFile As String = AppDomain.CurrentDomain.BaseDirectory + "Zone.xlsx"
cn = New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + ExcelFile + "; Extended Properties = 'Excel 8.0;HDR=Yes'")
cmd = New OleDbCommand("select [Zone] from [Feuil1$] where [Lieux]='" + data("site")("city").ToString + "'", cn)
cn.Open()
If cmd.ExecuteScalar <> Nothing Then
zone = cmd.ExecuteScalar.ToString
End If
cn.Close()
For a = 0 To DGW.Rows.Count - 1
For b = 3 To DGW.Columns.Count - 1
If zone = DGW.Rows(a).Cells(2).Value And data("date").ToString.Substring(0, 4) = TextBox1.Text And weekOfyear = DGW.Columns(b).HeaderText.ToString And data("user")("id").ToString = DGW.Rows(a).Cells(0).Value Then
NbrJour(a, b) += 1
End If
DGW.Rows(a).Cells(b).Value = NbrJour(a, b)
Next
Next
Next
totalResult = totalResult - 500
Skip = Skip + 500
Label3.Text = "Chargement en Terminé"
End While
DGW.Columns(1).SortMode = DataGridViewColumnSortMode.NotSortable
DGW.Columns(2).SortMode = DataGridViewColumnSortMode.NotSortable
DGW.Columns(1).DefaultCellStyle.BackColor = Color.LightCyan
DGW.Columns(2).DefaultCellStyle.BackColor = Color.LightCyan
'DGW.Rows(0).Frozen = True 'Block row 1
DGW.ColumnHeadersDefaultCellStyle.BackColor = Color.LightCyan
DGW.Columns(0).Visible = False 'Column 1 not visible
DGW.Columns(1).Frozen = True ' Block column 2
DGW.Columns(2).Frozen = True ' Block Column 3
End Sub
End Class
Edit :
Merci pour vos réponses,
bacelar a écrit:
Le passage par une classe supplémentaire, très probablement un DTO, permet d'isoler la couche Données de la couche Business, qui permet de très facilement changer de couche de Données.
Un DTO, c'est un peu comme j'ai fait dans mon premier post ?
DeveloSt a écrit:
Dim obj = JsonConvert.DeserializeObject(Of Name)(response.Content)
'For i = 0 To obj.count
DGW.Rows.Add(obj.infoUser1)
'Next
Public Class Name
Public infoUser1 As String
End Class
bacelar a écrit:
En cherchant un peu, tu devrais trouver des générateurs automatiques/proxys de ces DTO et de quoi les gérer facilement (souvent à base d'attributs .NET).
Il y a un moyen de le générer automatiquement ?
Sinon c'est quoi la différence entre un ORM et un DTO ?
bacelar a écrit:
Une DataGridView et un JsonConvert dans une même méthode ? Ca sent l'application monolithique pas testable tout ça.
Oui, pour l'instant c'est exactement ça
Je voulais juste arriver à un résultat rapidement avec mes connaissances...
Je cherche maintenant à l'améliorer
bacelar a écrit:
Pour les numéros de semaines, je ne crois pas qu'il y ait un standard international et les règles "françaises" sont assez casse-couilles (1er Mercredi de l'année, etc...). Vérifiez que ce qu'implémente le framework .NET suit les règles de votre client, qui n'est pas forcément ceux des States.
Je récupère les numéros de la façon suivante à partir de la date :
Dim weekOfyear As String = calendar.GetWeekOfYear(data("date"), dfi.CalendarWeekRule, DayOfWeek.Thursday)
>Un DTO, c'est un peu comme j'ai fait dans mon premier post ?
Non.
Si la source n'est plus une API Web, vous n'avez pas à changer votre code ? Non.
>j'ai vus que beaucoup de personne passe par une classe supplémentaire
C'est cette classe supplémentaire que je suppute être un DTO, que vous semblez considérer comme inutile mais qui, bien utilisée, rend l'architecture bien plus évolutive/gérable/testable/... .
Moi, je vois que vous prenez les objets sorties directement du cul du désérialisateur JSON pour les "fourrer" directement dans la DataGridView et que la logique de votre affichage est directement dépendant du requête "en dur" sur un fichier Excel.
Donc, vous faites comment pour tester votre application sans avoir à vous connecter à un serveur Web ou à installer MDAC sur les machines de tests ?
Vous faites comment pour tester les cas d'erreur ? (Réseau, format de fichier, etc...)
Résultat : une "application" qui ne gère aucune erreur (le moindre problème et c'est un saut dans l'inconnu), qui n'est pas correctement testable, etc...
>Il y a un moyen de le générer automatiquement ?
Plus ou moins oui, mais le but c'est pas de faire du "pissage" de code mais de maintenir la compatibilité entre la source et la destination des données.
La manière de faire est fonction des framework employés.
>Sinon c'est quoi la différence entre un ORM et un DTO ?
C'est quoi la différence entre un Tie-Fighter et un Star-Destroyer ? (DTO : Tie-Fighter ; ORM : Star-Destroyer)
>Je cherche maintenant à l'améliorer
Bin, rendez vos applications testables et capables d'évoluées sans avoir à tout refaire à chaque fois.
>Je récupère les numéros de la façon suivante à partir de la date :
Je ne connaissais pas la méthode "GetWeekOfYear" qui semble être apparu "récemment" (.NET 5). Pensez donc à bien choisir la valeur du 2ème paramètre pour qu'il corresponde à vos règles comptables. (Et vérifiez que vos comptables les suivent, on est jamais trop prudent)
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
VB.NET utilisation API
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr