Как получить обзор созданных структур в сопоставлении для определенного адреса в solidity?

#struct #mapping #ethereum #solidity #smartcontracts

#структура #сопоставление #ethereum #solidity #smartcontracts

Вопрос:

После того, как я создал некоторые структуры, которые принадлежат определенным адресам, я хочу получить обзор структур с соответствующими параметрами, относящимися к адресу. Итак, что я мог бы сделать для решения этой проблемы?

Если я запускаю свой код внутри remix, я получаю обратно только свою первую сохраненную структуру для адреса. Но я хочу вернуть все сохраненные структуры для одного адреса. Я знаю, что мы не можем выполнить итерацию по сопоставлению, но, может быть, можно создать некоторый счетчик индексов для массива структур, чтобы решить эту проблему? — Так возможно ли также сохранить индекс массива в переменной?

 pragma solidity ^0.4.17;
contract Prescribe {

struct Prescription {
        address patients_address;
        string medicament;
        string dosage_form;
        uint amount;
        uint date;
        //uint index_counter;
 }

mapping (address => Prescription[]) public ownerOfPrescription;
address [] public patients;

function createPrescription(address patients_address, string 
medicament, string dosage_form, uint amount, uint date) public  
restricted {

ownerOfPrescription[patients_address].push(Prescription({
     patients_address: patients_address,
     medicament: medicament,
     dosage_form: dosage_form,
     amount: amount,
     date: date
}));
patients.push(patients_address);
}

function getOverview(address patient) public view restricted 
returns(string, string, uint, uint) {

for(uint i = 0; i < ownerOfPrescription[patient].length; i  ) {
 if(ownerOfPrescription[patient][i].patients_address == patient) {
   return(ownerOfPrescription[patient][i].medicament, 
          ownerOfPrescription[patient][i].dosage_form, 
          ownerOfPrescription[patient][i].amount, 
          ownerOfPrescription[patient][i].date);
    }
  }

}
  

Итак, я хочу иметь возвращаемые значения всех отдельных структур одного адреса, как в функции getOverview на экране, но это возвращает мне только первую структуру адреса

Ответ №1:

Ну, это возвращает только первую, потому что после инструкции

  if(ownerOfPrescription[patient][i].patients_address == patient)
  

верните true, ваш код выполняет оператор return, который заставит элемент управления выйти из функции, и больше никаких инструкций выполняться не будет.

Комментарии:

1. Да, это имеет смысл, но как я могу решить эту проблему? — может быть, сохранить значения в другом массиве структур и вернуть их обратно во втором цикле?

Ответ №2:

Хорошо, после исследования я сделал вывод, что по-прежнему невозможно получить массив структур в качестве возвращаемого значения. У вас есть только возможность получить доступ к отдельным элементам массива, верно? — Если есть какие-либо обновления по этой теме, я был бы очень благодарен за подсказку.

Ответ №3:

Есть способ вернуть array of struct, но это будет стоить немного больше платы за газ. Ниже приведен пример

 contract Test {
struct FlexiblePlan {
    string token;
    address _address;
}
struct Plans {
    FlexiblePlan[] flexiblePlans;
}
Plans plans;
function createPlan(string memory _token, address _address) external {
    plans.flexiblePlans.push(FlexiblePlan(_token, _address));
}
function getAllPlans() external view returns(Plans memory){
    return plans;
}
  

}