7
votes

Fonction PV et portage VB6 à C #

Je travaille sur le portage du code VB6 classique en C # et je suis tombé sur une utilisation de la fonction pv .

Je me sens mal, y compris une référence à l'Assemblée Microsoft.VisualBasic. Est-ce quelque chose qui est couramment fait, ou devrais-je explorer d'autres options? L'idée suivante qui apparaît dans mon esprit explore cette fonction PV dans le réflecteur.


0 commentaires

4 Réponses :


1
votes

Vous pouvez utiliser cette bibliothèque qui duplique des fonctions Excel dans F #

Library

Il a PV qui est la valeur actuelle. Je l'ai utilisé une ou deux fois. Il suffit de le laisser tomber et d'ajouter la référence.


10 commentaires

Hmmm semble un peu risqué de compter sur une langue CTP, mais je pense que je préférerais faire cela que référence à la bibliothèque Microsoft.VisualBasic


Exactement, quand je l'ai utilisé, c'était pour éviter l'automatisation Excel et référencer Excel


La version "no notandalone" est de près de 1 mégot ... presque tentée de simplement attraper la fonction PV du réflecteur, mais je vais donner un coup de feu


Je préfère la solution de JDunkerley - je préfère ajouter une fonction de 2 lignes à mon code plutôt que de faire référence à une assemblée entière.


@Dave - -2 (-1 (-1 parce que je ne suis pas d'accord, et un autre -1 parce que je suis désemparé si noob et a accidentellement évoqué votre commentaire, et je ne peux pas l'annuler. Doh! ;-) Sérieusement, il y a du bien Stuff dans les bibliothèques VB (formes, par exemple). Je pense que c'est abrégé de ne pas profiter à cause du snobisme anti-VB.


@Tom Bushell Je suis d'accord dans ce cas si la fonction est exacte mais la bibliothèque offre également d'autres fonctions telles que YTM, ce qui est beaucoup plus difficile à reproduire et était ce dont j'avais besoin à l'époque.


@Tom tu as tordu mon bras, je vais juste l'utiliser.


Vous suggérez donc d'utiliser une bibliothèque non prise en charge d'une bande d'un homme à partir de galeries de code, juste pour éviter d'utiliser une bibliothèque de base entièrement prise en charge à partir du .NET Framework? Et cela a reçu des upvotes? Le débordement de la pile a soufflé un fusible. (L'utilisation de YTM pourrait avoir un sens, mais ce n'était pas la question dans ce cas.)


@MarkJ Je ne suggère pas qu'il n'utilise pas Microsoft.Visualbasic, je l'ai simplement dirigé vers une alternative. Sauf si je me trompe, je crois que c'était ce qu'il demandait. J'ai été signalé à cette bibliothèque moi-même d'une question similaire que j'ai postée.


La question était "est-ce que cela [évitant Microsoft.Visualbasic] quelque chose qui est couramment fait, ou devrais-je explorer d'autres options". Donc, si vous le signalez à une autre bibliothèque, vous conseillez implicitement en supprimant Microsoft.VisualBasic. Ou c'est comme ça que je l'ai lu quand même.



3
votes

assez droit vers l'avant pour reproduire en C # xxx

juste un re-arrangement de la formule Microsoft fournit .


1 commentaires

C'est presque un réarrangement de la formule de Microsoft, sauf lorsque le taux = 0. C'est lorsque votre version divise par zéro et VB6 et Microsoft.VisualBasic retourner -fv - (PMT * NPER) . Il y a des pièges même dans la codage d'une formule d'une page Web. Cela renforce ma réponse - pour la pitié, juste Utilisez Microsoft.VisualBasic et passez à mettre en œuvre une autre fonctionnalité pour les pauvres anciens utilisateurs.



11
votes

L'utilisation de Microsoft.VisualBasic de C # et VB.NET a été minutieusement discutée sous Cette question . L'espace de noms Microsoft.Visualbasic est entièrement pris en charge et sera autour aussi longtemps que .NET est autour . Il n'y a aucune raison de l'éviter.

edit: Il dit qu'au moment de taper, les autres réponses de cette question sont un de réimplémentation incorrecte de la fonction, et une bande d'un homme non supporté Bibliothèque à partir de galeries de code. Venez les gars, il faudrait un vrai événement majeur pour que Microsoft dépose les fonctions financières de VB .

C'est une histoire différente pour Microsoft.VisualBasic.compatibilité , qui est exclusivement à utiliser par l'assistant de mise à niveau VB6, edit a été marqué obsolète. NET 4 (ma prédiction est devenue réalité) et ne doit pas être utilisée pour un nouveau développement. Il y aurait des avantages dans l'élimination des références à cela, mais personnellement, j'essaierais probablement d'obtenir un port de travail entièrement de travail. Net 3.5.


3 commentaires

D'accord à 100% avec cela. D'où vient cette réticence à utiliser la bibliothèque prise en charge de Microsoft? Est-ce juste le "ewwww ... il dit vb" mentalité? Wtf? Microsoft a écrit VB6, C #, puis fourni (gratuitement) l'espace de noms Microsoft.Visualbasic à cet effet. Et toujours les gens hésitent à l'utiliser. Peu importe - prenez vos chances avec une autre option "non-VB, donc meilleure" ".


Juste pour ajouter: à la fin de la journée, tout est IL. Je peux écrire des choses dans C #, Visual Basic.Net, IronPython et Boo et la jeter dans le mélangeur (= compilateurs) et récupérer il qui ne sait pas ce que c'était auparavant.


Il y a une stigmatisation contre l'utilisation de VB parmi les développeurs C # et donc parce que cela a VisualBasic au nom, ils ne l'aiment pas parce qu'ils pensent qu'ils programment dans VB. Peut-être que MS devrait renommer cela sur Microsoft.reallyUtiliséAndsupporDsupports et tout le monde sera heureux



0
votes

J'ai essayé d'utiliser la réponse acceptée, mais je ne pouvais pas l'obtenir pour travailler dans le noyau .Net. J'ai fait des soins autour de ce code sur Github qui semble être la mise en œuvre de Microsoft de PV:

https://github.com/microsoft/referencesource/blob/master/microsoft.visalbasic/runtime/msvbalib/financial.vb#l662

    Public Function PV(ByVal Rate As Double, ByVal NPer As Double, ByVal Pmt As Double, Optional ByVal FV As Double = 0, Optional ByVal Due As DueDate = DueDate.EndOfPeriod) As Double

        Dim dTemp As Double
        Dim dTemp2 As Double
        Dim dTemp3 As Double

        If Rate = 0.0# Then
            Return (-FV - Pmt * NPer)
        Else
            If Due <> 0 Then
                dTemp = 1.0# + Rate
            Else
                dTemp = 1.0#
            End If
            dTemp3 = 1.0# + Rate

            '       WARSI Using the exponent operator for pow(..) in C code of PV. Still got
            '       to make sure that they (pow and ^) are same for all conditions
            dTemp2 = dTemp3 ^ NPer

            'Do divides before multiplies to avoid OverFlowExceptions
            Return (-(FV + Pmt * dTemp * ((dTemp2 - 1.0#) / Rate)) / dTemp2)
        End If

    End Function


0 commentaires