Mina produkter

Logga in för att följa kategorier och för att få genvägar i denna meny
Visma Administration, Fakturering & Förening
avbryt
Visar resultat för 
Sök istället efter 
Menade du: 
Gabriel E
NY MEDLEM

Finns det ett sätt att hämta ut hela radvektorn ur en radpekare utan att behöva ange ett index?

(uppdaterad av Tinna Gunnarsson MODERATOR ‎2020-05-26 13:25 )

Det vi håller på med är att skriva en ICollection-wrapper för rader så som ADK_OOI_HEAD_ROWS.

Det som önskas är att kunna hämta ut hela vektorn ur radpekaren för ADK_OOI_HEAD_ROWS utan att behöva ange index.

Som det är nu så verkar det som att om man ska lägga till en rad till ADK_OOI_HEAD_ROWS så måste man måste göra följande:
int pNewOrderRow = // pekare till en ADK_DB_ORDER_ROW som innehåller information.
int pOrder = // pekare till en order
// hämta ut antal rader för den nuvarande radvektorn:
double nRows = 0;
AdkGetDouble(pOrder, ADK_OOI_HEAD_NROWS, ref nRows);
// skapa en ny radvektor med nRows+1
var pDataRow = AdkCreateDataRow(ADK_DB_ORDER_ROW, nRows + 1);

// gå igenom den nuvarande radpekaren i pOrder:
for (int i = 0; i < nRows; i++) {
    int pOrderRow = 0;
    AdkGetData(pOrder, ADK_OOI_HEAD_ROWS, i, ref pOrderRow);
    var pTempData = AdkGetDataRow(pDataRow, i);
    // överför alla värden ifrån pOrderRow till pTempData
}

// sätt in den nya raden:
var pNewTempData = AdkGetDataRow(pDataRow, nRows);

// överför all information som finns i pNewOrderRow till pNewTempData

// uppdatera radpekaren i pOrder:
AdkSetData(pOrder, ADK_OOI_HEAD_ROWS, pDataRow);
// uppdatera antal rader
AdkSetDouble(pOrder, ADK_OOI_HEAD_NROWS, nRows + 1);
// uppdatera pOrder
AdkUpdate(pOrder);

Det som hade varit trevligt är att kunna hämta hem hela radvektorn. Kunna för varje index kunna sätta in en egen radpekare utan att behöva hämta hem en pTempData pekare och uppdatera den.

Typ: AdkSetDataRow(pDataRow, index, pNewOrderRow);

Eller för den delen kunna hämta hem en radpekare ur en radvektor och kunna ändra den pekaren.

4 SVAR 4
Roald Osbakk
ANSTÄLLD

Re: Finns det ett sätt att hämta ut hela radvektorn ur en radpekare utan att behöva ange ett index?

Undrar om du inte krånglar till det lite i onödan. Om du ska lägga till en rad på slutet ska det räcka det med att du jobbar med den sista raden. Kommentera bort hela loopen där du kopierar datat från raderna och testa.
Gabriel E
NY MEDLEM

Re: Finns det ett sätt att hämta ut hela radvektorn ur en radpekare utan att behöva ange ett index?

Så säg att jag ska skapa en ny rad på en radvektor som redan har 2 värden i sig så skapar jag det på sådant sätt:
var pDataRow = AdkCreateDataRow(ADK_DB_ORDER_ROW, 2 + 1);

Hämtar ut det sista värdet:
var lastRow = AdkGetDataRow(pDataRow, 2);

Ändrar den raden till vad jag vill sätta in, och sen sätter jag in vektorn på ADK_OOI_HEAD_ROWS:
AdkSetData(pOrder, ADK_OOI_HEAD_ROWS, pDataRow);

Om jag då gör :
var rowPtr = 0;
AdkGetData(pOrder, ADK_OOI_HEAD_ROWS, 0, ref rowPtr);

Kommer då den raden vara den som fanns innan jag gjorde AdkSetData(pOrder, ADK_OOI_HEAD_ROWS, pDataRow)?

Isåfall löser det en hel del 🙂

Kan det även vara så här:

Säg att jag har en rad i orderRow på position 1.
Den innehåller: ADK_OOI_ROW_TYPE_OF_ROW = "T";
ADK_OOI_ROW_TEXT = "Hejsansvejsan";

var pOrder = // den ordern.

var count = 0;
AdkGetDouble(pOrder, ADK_OOI_HEAD_NROWS, ref count);
var pDataRow = AdkCreateDataRow(ADK_DB_ORDER_ROW, count);
var pRow = AdkGetDataRow(pDataRow, 1);

AdkSetStr(pRow, ADK_OOI_ROW_TEXT, "Annat värde");
AdkSetData(pOrder, ADK_OOI_HEAD_ROWS, pDataRow);

Kommer då raden på position 1 att innehålla:
ADK_OOI_ROW_TYPE_OF_ROW = "T"
ADK_OOI_ROW_TEXT = "Annat värde"
?

Tacksam för svar 🙂
Roald Osbakk
ANSTÄLLD

Re: Finns det ett sätt att hämta ut hela radvektorn ur en radpekare utan att behöva ange ett index?

På första frågan så kommer inga värden över automatiskt i pDataRow från den gamla strukturen vid tilldelningen. Det du gör när du förbereder för ett anrop till AdkUpdate är att tala om vad du vill ha ändrat jämfört med det som finns. Det gör du i den nya pDataRow som du skapat. Du tilldelar order genom AdkSetData och efter ett lyckat anrop till AdkUpdate, så fyller apiet i datat för alla raderna. Så - om du försöker titta på innehållet i pDataRow så ser du bara dina ändringar fram till att du commitat med en AdkUpdate.



Svaret på andra frågan är att den bara innehåller "Annat värde" för fältet ADK_OOI_ROW_TEXT. Efter att du kört AdkUpdate (och det gick bra förstås) så är datastrukturen uppdaterad med de värden som finns i databasen och då kan man se det gamla värdet. Det är bara det du ändrat som du ser direkt efter du gjort anropet till AdkSetData. Här förutsätter jag att du jobbat med nyskapade rader via AdkCreateDataRow. Skulle du istället i detta fall jobba med befintliga rader så ser du ju även värdet för ADK_OOI_ROW_TYPE_OF_ROW. Om man inte ska skapa nya rader är det onödigt med att skapa om radområdet (förutsatt att du jobbar med en order du tagit fram med tex AdkFind). 

pRow = AdkGetDataRow(AdkGetData(pOrder, ADK_OOI_HEAD_ROWS), 1) borde tex funka.



Om man går upp till din ursprungliga fråga - så finns det en situation där det blir lite krångligt, och det är när man vill infoga en rad mellan två befintliga rader. Säg att du har 4 rader och vill få in en rad på som rad 3. Då får du skapa en struktur med 5 rader, kopiera innehållet från rad 4 i ordern till din nya strukturs rad 5, sen kopiera rad 3 till 4, sen skriva in din nya data för rad 3, göra en AdkSetData och slutligen köra en AdkUpdate.



Om du är intresserad av att kunna läsa ut gammal data skulle jag föreslå att du skapar en ny orderpekare (pOrderToUpdate) vid sidan om den du fått genom AdkFind. I den sätter du ordernummer från den du sökt fram och AdkSetData med dina nya rader, och kör AdkUpdate på pOrderToUpdate istället.

Gabriel E
NY MEDLEM

Re: Finns det ett sätt att hämta ut hela radvektorn ur en radpekare utan att behöva ange ett index?

Testat allt och det verkar funka. Det som bekymrar mig lite dock är att man MÅSTE köra en AdkUpdate direkt efter att man har lagt till en rad.
Säg att jag vill lägga till en rad EFTER att jag har lagt till en annan. Dvs:
1. Lägg till en rad, uppdatera data, uppdatera nrows.
2. Lägg till en till rad, uppdatera data, uppdatera nrows.
3. Uppdatera Huvudpekaren.

Så verkar det som att en del data försvinner påvägen. Jag vill helst vänta med att köra AdkUpdate av anledningen till att jag kanske inte vill spara den data jag försöker sätta in än.

Allt nedanstående sker innan en AdkUpdate.
Så säg:
var pOrder = AdkCreateData(ADK_DB_ORDER_HEAD);
AdkSetDouble(pOrder, ADK_OOI_HEAD_DOCUMENT_NUMBER, 1);

var pDataRow = AdkCreateDataRow(ADK_DB_ORDER_ROW, 1);
var pTempData = AdkGetDataRow(pDataRow, 0);
AdkSetStr(pTempData, ADK_OOI_ROW_TYPE_OF_ROW, "T");
AdkSetStr(pTempData, ADK_OOI_ROW_TEXT = "ExempelText");
AdkSetDouble(pOrder, ADK_OOI_HEAD_NROWS, 1);
AdkSetData(pOrder, ADK_OOI_HEAD_ROWS, pDataRow);

// sen kommer jag på att jag vill lägga till en till rad:

var pDataRow = AdkCreateDataRow(ADK_DB_ORDER_ROW, 2);
var pTempData = AdkGetDataRow(pDataRow, 1);
AdkSetStr(pTempData, ADK_OOI_ROW_TYPE_OF_ROW, "T");
AdkSetStr(pTempData, ADK_OOI_ROW_TEXT = "Annantext");
AdkSetDouble(pOrder, ADK_OOI_HEAD_NROWS, 2);
AdkSetData(pOrder, ADK_OOI_HEAD_ROWS, pDataRow);

AdkAdd(pOrder);

Det resultat jag får då är att jag har skapat ett orderhuvud med EN rad, dvs den rad med "Annantext". Det här har förmodligen med att göra att den första orderrowen inte existerar i visma.

Det är även i just detta fall som det hade varit trevligt att kunna sätta en extern pekare till en DataRow-vektor istället för att behöva hämta hem pTempData pekare och behöva sätta värden i den.

Dvs, något i stil med:

var pOrder = AdkCreateData(ADK_DB_ORDER_HEAD);
AdkSetDouble(pOrder, ADK_OOI_HEAD_DOCUMENT_NUMBER, 1);

// sätta in första raden

var pDataRow = AdkCreateDataRow(ADK_DB_ORDER_ROW, 1);
var pTempData = AdkGetDataRow(pDataRow, 0);
AdkSetStr(pTempData, ADK_OOI_ROW_TYPE_OF_ROW, "T");
AdkSetStr(pTempData, ADK_OOI_ROW_TEXT = "ExempelText");
AdkSetDouble(pOrder, ADK_OOI_HEAD_NROWS, 1);
AdkSetData(pOrder, ADK_OOI_HEAD_ROWS, pDataRow);

// sätta in andra raden:

var pDataRow = AdkCreateDataRow(ADK_DB_ORDER_ROW, 2);

// hämta hem den existerande raden.
var existingRow = AdkGetData(pOrder, ADK_OOI_HEAD_ROWS, 0);

// sätta den existerande raden i den skapade dataraden på index 0.
AdkSetDataRow(pDataRow, 0, existingRow);

// sätta den nya raden
var pTempData = AdkGetDataRow(pDataRow, 1);
AdkSetStr(pTempData, ADK_OOI_ROW_TYPE_OF_ROW, "T");
AdkSetStr(pTempData, ADK_OOI_ROW_TEXT = "Annantext");
AdkSetDouble(pOrder, ADK_OOI_HEAD_NROWS, 2);
AdkSetData(pOrder, ADK_OOI_HEAD_ROWS, pDataRow);