Ошибка компиляции: выражение поля не допускается для универсального объекта SObject в строке 33, столбец 69

Я пытаюсь написать универсальный контроллер, который будет работать для нескольких различных типов объектов, но когда я пытаюсь получить доступ к настраиваемым полям из этих объектов, я получаю следующую ошибку:

Ошибка компиляции: выражение поля не допускается для универсального объекта SObject в строке 33, столбец 69

Вот мой общий код контроллера:

public with sharing class PhotoUploadController {

    public Attachment objAttach{get;set;}
    public sObject sobj{get;set;}
    public string ObjectName {get;set;}
    public Decimal Height{get;set;}
    public Decimal Width {get;set;}
    Public List<Attachment> lstAttachment {get;set;}

     public String setObjectType(sObject newObj)
      {
        this.ObjectName = newObj.getSObjectType().getDescribe().getName();
        return(this.ObjectName );
       }

    public String getObjectType() 
    {
          return(this.ObjectName);  
     }

   public PhotoUploadController (ApexPages.StandardController controller)
     {

        objAttach=new Attachment();
        lstAttachment= new List<Attachment>();
        sobj = controller.getRecord();
        if(sobj.id!=null){
           sobj = Database.query('select id,name,Image_Attachment_ID__c from ObjectName where id=:sobj.id');  
        } 

         if(sobj.Image_Attachment_ID__c!=null){

            lstattachment=[SELECT id,body from Attachment where Id=:sobj.Image_Attachment_ID__c limit 1];
            if(lstattachment.size()>0)
            {
                objAttach=lstattachment[0];
            }
        }         
    }

    public pageReference savePhoto(){  
     sobj.HeightOfPhoto__c=Height;
     sobj.WidthOfPhoto__c=Width;

        try {
            if (!Schema.sObjectType.sobjectName.isUpdateable())
                {
                  return null;
                }
            String contentType;

            if(objAttach.ContentType !=null){
               contentType=objAttach.ContentType;
            }

            if(contentType !=null && (contentType == 'image/jpeg' || contentType == 'image/CR2' || contentType== 'image/jpg' || contentType== 'image/png' || contentType== 'image/bmp' || contentType== 'image/gif')){            
            //objAttach.body=body;
            //objAttach.name=name;
            if(objAttach.body!=null && objAttach.name!=null && sobj.id !=null){
                 If(objAttach.Id==null)
                     objAttach.parentId=sobj.id;
                 if(!Schema.sObjectType.Attachment.isUpdateable()){
                  return null;
                  }

                 try{
                        upsert objAttach;
                        sobj.Image_URL__c=URL.getSalesforceBaseUrl().toExternalForm()+'/servlet/servlet.FileDownload?file='+objAttach.id;
                        sobj.Image_Attachment_ID__c= objAttach.id;
                        objAttach =null;
                        if (!Schema.sObjectType.ObjectName.isUpdateable()){
                          return null;
                        }
                       upsert sobj;
                   }
                   catch (DMLException e) {
                           if(e.getMessage().contains('STORAGE_LIMIT_EXCEEDED')){
                              ApexPages.addMessage(new ApexPages.message(ApexPages.severity.ERROR,'Your orgnization Storage Limit has been exceeded, Please contact your Administrator.'));
                           }else{
                             ApexPages.addMessage(new ApexPages.message(ApexPages.severity.ERROR,'Error uploading attachment'));
                           }
                           return null;
                    }finally {
                          objAttach = new Attachment();
                    }    
            }

         }
         else{
              objAttach = new Attachment();
              ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR,'Please, Upload image file with extension .JPG .JPEG .BMP .PNG or .GIF'));
              return null;
         }
        }
        catch(Exception e) {            
             return null;
        }
        return new pagereference('/'+sobj.id);    
    }

}

Может кто-нибудь объяснить это сообщение об ошибке немного подробнее? Как получить доступ к нужным полям из общего типа SObject?

1 ответ

В вашем коде есть пара проблем, но причиной сообщения об ошибке является следующий фрагмент:

sobj.Image_Attachment_ID__c

Вы не указали, какой тип SObject вы ожидаете, поэтому нет способа узнать:

  1. Если SObject в памяти даже имеет это поле
  2. Что это за поле
  3. Какие метаданные принадлежат этому полю (если поле было списком выбора, у вас может быть несколько объектов SO с одним и тем же именем поля, но с разными параметрами списка выбора и т. Д.)

Функция get (fieldName) может быть полезна для вас в этом сценарии. Вы можете получить исключение (которое вы можете перехватить), если у SObject нет этого поля, и вы можете преобразовать значение в соответствующий тип данных (так как он будет возвращать только объект), что может выдает ошибку приведения, если значением является datetime и вы пытаетесь привести его к Id и т. д.

Еще одна проблема, которую я заметил:

[SELECT id,body from Attachment where Id=:sobj.Image_Attachment_ID__c limit 1] никогда не вернет значение. Я думаю ты имел ввиду ParentId=:sobj.Image_Attachment_ID__c,

Другие вопросы по тегам