Πώς να περάσει απαριθμούνται τιμές σε μια υπηρεσία web




δίλημμα μου είναι, βασικά, πώς να μοιραστώ μια απαρίθμηση των δύο εφαρμογών.


Οι χρήστες φορτώσετε τα έγγραφα μέσω ενός front-end εφαρμογή που είναι στο διαδίκτυο. Η εφαρμογή αυτή απαιτεί μια διαδικτυακή υπηρεσία του back-end εφαρμογή και περνά το έγγραφο σε αυτό. Το back-end εφαρμογή αποθηκεύει το έγγραφο και εισάγει μια σειρά στο *έγγραφο* πίνακα.


Ο τύπος εγγράφου (7 πιθανούς τύπους εγγράφου: *Τιμολόγιο* , *Συμβόλαιο* κλπ) διέρχεται ως παράμετρος στην υπηρεσία ίντερνετ *UploadDocument* μέθοδο. Το ερώτημα είναι, τι θα έπρεπε το είδος (και πιθανές τιμές) αυτής της παραμέτρου είναι;


Από τη στιγμή που πρέπει να hardcode αυτές τις αξίες και στις δύο εφαρμογές, νομίζω ότι είναι ΟΚ για να χρησιμοποιήσετε ένα περιγραφικό εγχόρδων ( *Τιμολόγιο* , *Συμβόλαιο* , *WorkOrder* , *SignedWorkOrder* ).


Είναι ίσως η καλύτερη προσέγγιση για τη δημιουργία ενός *DocumentTypes* απαρίθμηση στην πρώτη εφαρμογή, και να την αναπαράγουν και στη δεύτερη εφαρμογή, και στη συνέχεια να περάσει την αντίστοιχη ακέραια τιμή για την υπηρεσία web μεταξύ τους;
Μπορώ να μιλήσω μόνο για το .net, αλλά αν έχετε ένα Webservice ASP.net, θα πρέπει να μπορείτε να προσθέσετε μια απαρίθμηση απευθείας σε αυτό.


Όταν στη συνέχεια χρησιμοποιήστε το «Add Web αναφοράς» στην Εφαρμογή Πελάτη σας, η προκύπτουσα κατηγορίας θα πρέπει να περιλαμβάνει αυτό το enum


Αλλά αυτό είναι από την κορυφή του κεφαλιού μου, είμαι αρκετά σίγουρος ότι έχω κάνει και στο παρελθόν, αλλά δεν μπορώ να πω με σιγουριά.
Συχνά αυτό επιτυγχάνεται με τη χρήση [«Driven δεδομένων Συνδρομές»](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , αλλά αυτή η λειτουργία είναι διαθέσιμη μόνο σε ορισμένες εκδόσεις του SQL: Enterprise και Business Intelligence, αλλά όχι στο πρότυπο.


Έτσι, υπάρχει μια σειρά από δημιουργικές λύσεις. Αλλά δεν μου αρέσει κάποια από αυτές, και απαιτούν ένα δίκαιο κομμάτι της εργασίας έξω από SSRS.


Οι λύσεις που έχω δει περιλαμβάνουν: Δημιουργία της εγγραφής και στη συνέχεια απενεργοποίηση ή επιτρέπουν την εργασία SQL που στέλνει τη συνδρομή (που προσδιορίζονται από GUID.)


Δημιουργήστε ένα .exe .NET περιτύλιγμα για να χειριστεί την αποστολή του email. Μπορεί να εκτελέσετε το ερώτημα πρώτα να δούμε πόσα επέστρεψε σειρές, και στη συνέχεια, αν χρειαστεί, να δημιουργήσει την έκθεση και να συμπεριληφθεί σε ένα email. Αυτή είναι η γνώμη μου, αλλά? όπως ακριβώς και οι τάξεις περίπτωση δεν, θα ήθελα να εφαρμόσουν μια `copy`μέθοδο του είδους στην τάξη για να καταστεί δυνατή η τροποποίηση, διατηρώντας παράλληλα το αμετάβλητο, αλλά υπάρχει ορισμένες περιπτώσεις που δεν μπορώ να βοηθήσω να το μεταβλητό? Για παράδειγμα, όταν κάτι αναμένεται να γίνει η λειτουργία αντιγραφής είναι πολύ μεγάλη και αργή για την κατηγορία? όπως όταν η τάξη έχει τόσα πολλά συχνά τροποποιημένο μέλη. Και μην ανησυχείτε για χιλιάδες περιπτώσεις που επιπλέουν γύρω στη μνήμη, επειδή είναι αυτόματα GC'ed, οπότε το πιο πραγματικό πρόβλημα είναι ο χρόνος κόστος της αντιγραφής περιπτώσεις της κλάσης. Παρακαλώ πείτε μου εάν η γνώμη μου είναι κάπως λάθος :) **Για την «ορθογραφία λάθος» μέρος (Μήπως εννοείτε)**


* Θα μπορούσατε να κάνετε κάποια `LIKE`ερωτήματα στο db π.χ. `LIKE %j%e%a%n%s%`, αλλά αν θέλετε να το κάνετε καλά, θα πρέπει να χρησιμοποιήσετε μια βιβλιοθήκη αναζήτησης όπως αυτό:


	+ <https://github.com/TomLingham/Laravel-Searchy>
	+ <http://tnt.studio/blog/did-you-mean-functionality-with-laravel-scout>



> 
> Μπορείτε να δημοσιεύσετε το αρχείο ρυθμίσεων στον κατάλογο της εφαρμογής σας και να παρακάμψετε τις ρυθμίσεις, εκτελώντας php τεχνίτη πωλητή: δημοσιεύει για να αντιγράψετε τις ρυθμίσεις στο φάκελο config σας όπως searchy.php
> 
> 
> Μπορείτε να ορίσετε το προεπιλεγμένο πρόγραμμα οδήγησης που θα χρησιμοποιηθεί για τις αναζητήσεις στο αρχείο ρυθμίσεων. Οι επιλογές σας (στην παρούσα φάση) είναι: ασαφή, απλό και Levenshtein.
> 
> 
> Μπορείτε επίσης να παρακάμψετε αυτές τις μεθόδους, χρησιμοποιώντας την ακόλουθη σύνταξη κατά την εκτέλεση μιας αναζήτησης:
> 
> 
> 


Με τον καθορισμό [Levenshtein απόσταση](https://en.wikipedia.org/wiki/Levenshtein_distance) μπορείτε να finetune πόσο μακριά μια λέξη μπορεί να είναι.


* Αν χρειάζεστε καλύτερη απόδοση θα πρέπει να εξετάσει κάτι σαν `solr`ή `elasticsearch`για το έργο αυτό.


<https://wiki.apache.org/solr/SpellCheckComponent>
<https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html>


**Για το τμήμα μετάφρασης**


Απλά θα πρέπει να έχει ένα λεξικό έτοιμο σε βάση δεδομένων ή εντοπισμό των αρχείων σας και εκτελέστε το χαμηλότερο σημείο εισόδου και αυτό. Αναμείνετε υψηλή φορές υπολογιστών τόσο για τη διόρθωση ορθογραφίας και της μετάφρασης στον κώδικά σας. <p><strong> συνολικά: </strong></p><p>τόσο το put όσο και το post μπορούν να χρησιμοποιηθούν για τη δημιουργία.</p><p>πρέπει να ρωτήσετε "σε τι εκτελείτε τη δράση;" να διακρίνετε τι πρέπει να χρησιμοποιείτε. ας υποθέσουμε ότι σχεδιάζετε ένα api για να κάνετε ερωτήσεις. εάν θέλετε να χρησιμοποιήσετε το post τότε θα το κάνετε σε μια λίστα ερωτήσεων. εάν θέλετε να χρησιμοποιήσετε το put τότε θα το κάνετε αυτό σε μια συγκεκριμένη ερώτηση.</p><p><strong> μεγάλη και οι δύο μπορούν να χρησιμοποιηθούν, έτσι ποιο πρέπει να χρησιμοποιήσω στο restful σχεδιασμό μου: </strong></p><p>δεν χρειάζεται να υποστηρίζετε τόσο το put όσο και το post.</p><p>το οποίο χρησιμοποιείται παραμένει στο χέρι σας. αλλά θυμηθείτε να χρησιμοποιήσετε το σωστό, ανάλογα με το αντικείμενο που αναφέρετε στο αίτημα.</p><p>μερικές σκέψεις:</p><ul> <li>ονομάζετε ρητά τα αντικείμενα url που δημιουργείτε ή αφήστε το διακομιστή να αποφασίσει; εάν τους ονομάσετε τότε χρησιμοποιήστε put. εάν αφήσετε τον διακομιστή να αποφασίσει στη συνέχεια, χρησιμοποιήστε το post.</li> <li>put είναι idempotent, οπότε αν put ένα αντικείμενο δύο φορές, δεν έχει καμία επίδραση. αυτή είναι μια ιδιοκτησία της νίκαιας, οπότε θα μπορούσα να χρησιμοποιήσω το put όταν ήταν δυνατόν.</li> <li>μπορείτε να ενημερώσετε ή να δημιουργήσετε έναν πόρο με put με την ίδια διεύθυνση url αντικειμένου</li> <li>με το post μπορείτε να έχετε 2 αιτήματα που εισέρχονται ταυτόχρονα για τροποποιήσεις σε μια διεύθυνση url και μπορεί να ενημερώσουν διαφορετικά μέρη του αντικειμένου.</li> </ul><p><strong> ένα παράδειγμα: </strong></p><p> <a href="https://stackoverflow.com/questions/256349/what-are-the-best-common-restful-url-verbs-and-actions/256359#256359">έγραψα τα εξής ως μέρος μιας άλλης απάντησης σχετικά με το so</a> :</p><blockquote> <p><strong> post: </strong></p> <p>χρησιμοποιείται για την τροποποίηση και την ενημέρωση ενός πόρου</p> <pre><code>post /questions/&lt;existing\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>σημειώστε ότι το ακόλουθο είναι ένα σφάλμα:</p> <pre><code>post /questions/&lt;new\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>εάν η διεύθυνση url δεν έχει δημιουργηθεί ακόμη, δεν θα πρέπει να χρησιμοποιείτε το post για να το δημιουργήσετε ενώ καθορίζετε το όνομα. αυτό θα πρέπει να έχει ως αποτέλεσμα ένα σφάλμα 'πόρος δεν βρέθηκε' επειδή το <code>&lt;new\_question&gt;</code> δεν υπάρχει ακόμα. πρέπει πρώτα να τοποθετήσετε τον πόρο <code>&lt;new\_question&gt;</code> στον διακομιστή.</p> <p>θα μπορούσατε όμως να κάνετε κάτι τέτοιο για να δημιουργήσετε πόρους χρησιμοποιώντας post:</p> <pre><code>post /questions http/1.1 host: www.example.com/ </code></pre> <p>σημειώστε ότι σε αυτήν την περίπτωση το όνομα του πόρου δεν έχει καθοριστεί, η διαδρομή url των νέων αντικειμένων θα σας επιστραφεί.</p> <p><strong> σημειωση: </strong></p> <p>χρησιμοποιείται για τη δημιουργία ενός πόρου ή για την αντικατάστασή του. ενώ ορίσετε τους πόρους νέα διεύθυνση url.</p> <p>για έναν νέο πόρο:</p> <pre><code>put /questions/&lt;new\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>για να αντικαταστήσετε μια υπάρχουσα πηγή:</p> <pre><code>put /questions/&lt;existing\_question&gt; http/1.1 host: www.example.com/ </code></pre></blockquote> μια πολύ απλή τακτική παρόμοια με την δική σας, είναι να πάρετε τα εμβαδόν του κάθε διαμερίσματος και αφού τα κάνετε μία πρόσθεση όλα μαζί το με αποτέλεσμα της πρόσθεσης πχ 800 τμ να διαιρέσετε τον αριθμό 1000 και με τον αριθμό που θα βρείτε πχ το 1,25 να πολλαπλασιάσετε το εμβαδόν του κάθε διαμερίσματος για το μετατρέψετε σε χιλιοστά. μετά με βάση τα χιλιοστά του 1ου διαμερίσματος πχ 200 και έξοδα 500 ευρώ διαιρείτε τα 500 ευρώ με τον αριθμό 1000 και πολλαπλασιάζετε με τα 200 χιλιοστά 500ευρώ/1000=0,5 χ 200χιλ = 100 ευρώ και το ίδιο και για τα άλλα. τώρα τα κλειστά διαμερίσματα αφού με τον τρόπο αυτό βρείτε πόσο οφείλουν θα τα χρεώσετε μόνο το 30% το υπόλοιπο 70 πχ 150 ευρώ θα το ξαναμοιράσετε σε όλα ξανά με το ίδιο τρόπο. αν θέλετε μπορείτε να εγγραφείτε στην δωρεάν on line έκδοση κοινοχρήστων που έχω στην ιστοσελίδα και να τα βγάλετε από εκεί. τρουλλινός γιώργος 6932860310 υδραυλικές εργασίες σε όλη την αθήνα - αττική μεταμόρφωση, αιγάλεω, κορυδαλλός, κηφισιά, αργυρούπολη, φιλοθέη μια πολύ απλή τακτική παρόμοια με την δική σας, είναι να πάρετε τα εμβαδόν του κάθε διαμερίσματος και αφού τα κάνετε μία πρόσθεση όλα μαζί το με αποτέλεσμα της πρόσθεσης πχ 800 τμ να διαιρέσετε τον αριθμό 1000 και με τον αριθμό που θα βρείτε πχ το 1,25 να πολλαπλασιάσετε το εμβαδόν του κάθε διαμερίσματος για το μετατρέψετε σε χιλιοστά. μετά με βάση τα χιλιοστά του 1ου διαμερίσματος πχ 200 και έξοδα 500 ευρώ διαιρείτε τα 500 ευρώ με τον αριθμό 1000 και πολλαπλασιάζετε με τα 200 χιλιοστά 500ευρώ/1000=0,5 χ 200χιλ = 100 ευρώ και το ίδιο και για τα άλλα. τώρα τα κλειστά διαμερίσματα αφού με τον τρόπο αυτό βρείτε πόσο οφείλουν θα τα χρεώσετε μόνο το 30% το υπόλοιπο 70 πχ 150 ευρώ θα το ξαναμοιράσετε σε όλα ξανά με το ίδιο τρόπο. αν θέλετε μπορείτε να εγγραφείτε στην δωρεάν on line έκδοση κοινοχρήστων που έχω στην ιστοσελίδα και να τα βγάλετε από εκεί. τρουλλινός γιώργος , υδραυλικός , αθήνα , αττική , 6932860310. <p>μπορείτε να λάβετε ροή εξόδου για τη σύνδεση και να γράψετε τη συμβολοσειρά ερώτησης παραμέτρων σε αυτήν.</p><pre><code>url url = new url("http://yoururl.com"); httpsurlconnection conn = (httpsurlconnection) url.openconnection(); conn.setreadtimeout(10000); conn.setconnecttimeout(15000); conn.setrequestmethod("post"); conn.setdoinput(true); conn.setdooutput(true); list&lt;namevaluepair&gt; params = new arraylist&lt;namevaluepair&gt;(); params.add(new basicnamevaluepair("firstparam", paramvalue1)); params.add(new basicnamevaluepair("secondparam", paramvalue2)); params.add(new basicnamevaluepair("thirdparam", paramvalue3)); outputstream os = conn.getoutputstream(); bufferedwriter writer = new bufferedwriter( new outputstreamwriter(os, "utf-8")); writer.write(getquery(params)); writer.flush(); writer.close(); os.close(); conn.connect(); </code></pre><p>...</p><pre><code>private string getquery(list&lt;namevaluepair&gt; params) throws unsupportedencodingexception { stringbuilder result = new stringbuilder(); boolean first = true; for (namevaluepair pair : params) { if (first) first = false; else result.append("&amp;"); result.append(urlencoder.encode(pair.getname(), "utf-8")); result.append("="); result.append(urlencoder.encode(pair.getvalue(), "utf-8")); } return result.tostring(); } </code></pre> Η προτιμώμενη μέθοδος είναι να χρησιμοποιήσετε πραγματικά την ιδιότητα υπό όρους για να τυλίξει τις κλήσεις εντοπισμού σφαλμάτων σας, μην χρησιμοποιήσετε τις οδηγίες μεταγλωττιστή. #ifs μπορεί να πάρει δύσκολες και μπορεί να οδηγήσει σε περίεργα προβλήματα κατασκευής.


Ένα παράδειγμα της χρήσης ενός υπό όρους χαρακτηριστικό είναι η εξής (σε C #, αλλά λειτουργεί σε VB.NET πολύ):



```
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

```

Κατά τη μεταγλώττιση, χωρίς το σετ σημαία DEBUG, κάθε κλήση προς WriteDebug θα καταργηθούν όπως υποτίθεται συνέβαινε με Debug.Write (). <p>απλά χρησιμοποιήστε <a href="http://ruby-doc.org/core-1.9.3/array.html#method-i-sample"><code>array#sample</code></a> :</p><pre><code>[:foo, :bar].sample # =&gt; :foo, or :bar :-) </code></pre><p>διατίθεται σε ruby 1.9.1+. για να μπορέσετε να το χρησιμοποιήσετε με μια προηγούμενη έκδοση του ruby, θα μπορούσατε <a href="https://github.com/marcandre/backports"><code>require "backports/1.9.1/array/sample"</code></a> .</p><p>σημειώστε ότι στο ruby 1.8.7 υπάρχει κάτω από το ατυχές όνομα <code>choice</code>; μετονομάστηκε σε μεταγενέστερη έκδοση, επομένως δεν πρέπει να το χρησιμοποιήσετε.</p><p>παρόλο που δεν είναι χρήσιμη σε αυτή την περίπτωση, το <code>sample</code> δέχεται ένα όρισμα αριθμού σε περίπτωση που θέλετε μια σειρά διακριτών δειγμάτων.</p> Όχι, `index`είναι απλά ένα όνομα που έχει εκχωρηθεί για να δείξει το δείκτη. Πρακτικά και οι δύο τύποι είναι ίδιες.